tr (od translate) to filtr, który czyta znaki ze standardowego wejścia, przetwarza je znak po znaku i wypluwa wynik na standardowe wyjście. Nie otwiera plików samodzielnie — działa wyłącznie na strumieniu, więc karmisz go potokiem albo przekierowaniem. Nadaje się do trzech zadań: zamiany jednych znaków na inne (wielkie na małe litery), usuwania konkretnych znaków oraz redukcji powtórzeń do jednego wystąpienia. To jeden z tych drobiazgów, które w jednej linijce robią to, co w innym języku zajęłoby pętlę.
Składnia i najważniejsze opcje
Podstawowa forma: tr [opcje] ZBIOR1 [ZBIOR2]
Tłumaczenie następuje, gdy nie podasz -d, a obecne są oba zbiory: każdy znak z ZBIOR1 zostaje zamieniony na znak na tej samej pozycji w ZBIOR2.
-d— usuwa znaki należące doZBIOR1(wtedyZBIOR2nie podajesz).-s— redukuje (squeeze) powtarzające się sąsiadujące znaki z ostatniego zbioru do jednego.-c— działa na dopełnieniuZBIOR1, czyli na wszystkich znakach, których w nim nie ma.-t— przycinaZBIOR1do długościZBIOR2przed tłumaczeniem.- Zakresy:
a-z,0-9oraz klasy POSIX, np.[:alpha:],[:digit:],[:space:],[:punct:],[:upper:],[:lower:].
Przykłady użycia
echo "Hello World" | tr 'a-z' 'A-Z'— zamienia małe litery na wielkie (klasyczny upper-case).tr '[:upper:]' '[:lower:]' < plik.txt— sprowadza całą zawartość pliku do małych liter, używając klas POSIX.tr -d '\r' < windows.txt > unix.txt— wycina znaki powrotu karetki, czyli szybka konwersja końców linii CRLF na LF.echo "a b c" | tr -s ' '— ściska wielokrotne spacje do pojedynczej.tr -cd '[:print:]\n' < brudny.txt— usuwa wszystko poza znakami drukowalnymi i nową linią, przydatne do czyszczenia śmieciowych bajtów.
Częste błędy i pułapki
Najczęstsza wpadka to próba podania nazwy pliku jako argumentu: tr a b plik.txt nie zadziała, bo tr nie czyta plików — użyj tr a b < plik.txt albo potoku. Druga rzecz: gdy ZBIOR1 jest dłuższy od ZBIOR2, ostatni znak ZBIOR2 jest domyślnie powtarzany, aż zbiory się zrównają (o ile nie użyjesz -t) — łatwo o niespodziankę.
tr operuje na pojedynczych znakach (bajtach), a nie na łańcuchach — nie zamienisz nim słowa na inne słowo, do tego masz sed. Uważaj też na lokalizację: w UTF-8 polskie znaki to wielobajtowe sekwencje, a GNU tr historycznie nie obsługuje ich jak pojedynczych znaków, więc tr 'ą' 'a' potrafi narobić bałaganu. W razie potrzeby ustaw LC_ALL=C albo sięgnij po sed/iconv. Na macOS (BSD tr) klasy POSIX i składnia zakresów zachowują się nieco inaczej niż w GNU — jeśli skrypt ma być przenośny, testuj na obu.
Powiązane komendy: sed, awk, cut, iconv, dos2unix.