tr

Tłumaczy, usuwa lub redukuje znaki w strumieniu tekstu.

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 do ZBIOR1 (wtedy ZBIOR2 nie podajesz).
  • -s — redukuje (squeeze) powtarzające się sąsiadujące znaki z ostatniego zbioru do jednego.
  • -c — działa na dopełnieniu ZBIOR1, czyli na wszystkich znakach, których w nim nie ma.
  • -t — przycina ZBIOR1 do długości ZBIOR2 przed tłumaczeniem.
  • Zakresy: a-z, 0-9 oraz 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.