Strona 1 z 1

sed - zamiana wielkich liter na małe

: 02 marca 2011, 17:48
autor: timo
Dlaczego taki kod

Kod: Zaznacz cały

sed -i -e '/numer/ s/[A-Z]/[a-z]/g' plik
zamienia w liniach ze słowem numer wielkie litery na dosłowne ciągi [a-z] zamiast na małe litery?

: 02 marca 2011, 20:15
autor: lessmian2
Bo s zamienia coś, co pasuje do wzorca w pierwszym //, a coś, co jest w drugim //, przy czym to drugie nie jest w żaden sposób interpolowane (nie jest wzorcem, zakresem czy zbiorem znaków). Do tego służy y, ale akurat w tym przypadku, sed jest marną namiastką tr - niżej porównanie tej samej funkcjonalności:

Kod: Zaznacz cały

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
tr A-Z a-z
I tak, nie da się w sedzie podać [A-Z] przy użyciu y ;)

: 02 marca 2011, 21:09
autor: timo
Tak, tylko, że tr - z tego co wywnioskowałem z podręcznika systemowego - nie ma funkcji zamiany tylko w wierszach zawierających dane słowo - musiałbym kombinować z grepem, a potem zapisywaniem wyników do odpowiednich linii w pliku źródłowym, więc jednak zdecydowałem się na sed. Ale dziękuję za pomoc, bo sam kombinując nie wpadłem na ten y :)

: 02 marca 2011, 21:28
autor: lessmian2
To może tak:

Kod: Zaznacz cały

echo 'TEST 1234 TEST' | perl -pne 'y/A-Z/a-z/ if /1234/'
test 1234 test

: 03 marca 2011, 09:52
autor: timo
Faktycznie, działa, dziękuję.