Zamiana wielkich liter na małe

0

Hej, mam do zrobienia takie zadanko:
Wykorzystując program tr napisz polecenie zamieniające wszystkie wielkie litery na małe, a znaki nie będące znakami alfanumerycznymi na znaki podkreślenia. Użyj POSIX-owych klas znaków, aby uzyskać prawidłową zamianę dla polskich liter włącznie z ż, ź, Ż, Ź, itp. Uwaga: można napisać dwa oddzielne wywołania tr-a w potoku.

Coś mi się udało wymyślić, ale to nie do końca działa.
Np. cat plik | tr '[]' '[]'
// zawartość plik: To jest %^&FBTGNGnajwspaniaŚĆŻĘŁÓŃlszy plik.
No to mam coś takiego:
to jest %^&fbtgngnajwspaniaŚĆŻĘŁÓŃlszy plik.
Dlaczego nie zamienia polskich znaków?

I nie wiem jak zapisać znaki niealfanumeryczne, bo umiem zamienić znaki alfanumeryczne na podkreślenia.
cat plik | tr [] '_' | tr '[]' '[]'

Proszę o jakąś malutką pomoc. :)

0
echo "ŻÓŁĆ" | tr [ĄĆŁŻÓ] [ąćłżó]

Więc pewnie zadziała:

cat plik | tr '[:upper:]' '[:lower:]'  | tr [ĄÓŁŻŹĆĘŃŚ] [ąółżźćęńś]
0

Prowadzącemu chyba się pomyliło, bo tr nie obsługuje Unikodu (http://unix.stackexchange.com/questions/228558/how-to-make-tr-aware-of-non-asciiunicode-characters). Rozwiązaniem jest to co podał @Spine lub użycie zamiast tego GNU AWK:

awk '{ print tolower($0) }' plik | tr -c '[:alnum:]' '_'

Przy czym ten kod dalej jest niepoprawny, gdyż [:alnum:] również nie zawiera Unikodu.

Zamiast tego użyjemy GNU sed:

awk '{ print tolower($0) }' plik | sed 's/[^[:alnum:]]/_/g'

Takim oto sposobem mamy rozwiązanie, które działa, ale niestety (albo stety) nie używa tr.

0

Dziękuję bardzo! Cóż, prowadzący będzie musiał przeżyć brak 'tr'. Jeszcze raz dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1