TR(1)

NAZWA
tr - przetłumacz lub usuń znaki

SKŁADNIA

tr  [-cst] [--complement] [--squeeze-repeats]
    [--truncate-set1] łańcuch1 łańcuch2

tr  [-cs] [--complement] [--squeeze-repeats] łańcuch1

tr  [-cd] [--complement] [--delete] łańcuch1

tr  [-cds] [--complement] [--delete] [--squeeze-repeats]
    łańcuch1 łańcuch2

tr  [--help] [--version]

OPIS
Dokumentacja niniejsza nie jest już utrzymywana i może być niedokładna lub niekompletna. Autorytatywnym źródłem jest obecnie dokumentacja Texinfo. Dostęp do niej uzyskasz wpisując w wierszu poleceń:
    pinfo tr
lub
    info tr.

Ta strona podręcznika opisuje polecenie tr w wersji GNU. tr kopiuje standardowe wejście na standardowe wyjście, dokonując jednej z poniższych operacji:

    • przekład, opcjonalnie ściśnięcie powtórzonych znaków w wyniku
    • ściśnięcie powtórzonych znaków
    • usunięcie znaków
    • usunięcie znaków, potem ściśnięcie powtórzonych znaków w wyniku

Argumenty łańcuch1 i (jeśli podany) łańcuch2 definiują uporządkowane zbiory znaków, poniżej nazwane zb1 i zb2. Owe zbiory to znaki z wejścia, na których działa tr. Opcja --complement (-c) zastępuje zb1 jego dopełnieniem (wszystkimi znakami, których nie ma w zb1).

  OKREŚLANIE ZBIORÓW ZNAKÓW

Format argumentów łańcuch1 i łańcuch2 przypomina format wyrażeń regularnych; jednakowoż, nie są to wyrażenia regularne, lecz tylko listy znaków. Większość znaków w tych łańcuchach reprezentuje po prostu same siebie, ale łańcuchy mogą też, dla wygody, zawierać wyliczone poniżej skróty. Niektórych z nich można użyć tylko w łańcuch1 lub łańcuch2, jak zaznaczono poniżej.

Odwrotny ukośnik, po którym nie następuje znak spośród wymienionych poniżej powoduje komunikat o błędzie.

\a  Control-G.

\b  Control-H.

\f  Control-L.

\n  Control-J.

\r  Control-M.

\t  Control-I.

\v  Control-K.

\ooo
    Znak o wartości podanej przez ooo, czyli od 1 do 3 cyfr ósemkowych.

\\  Odwrotny ukośnik.

Zakresy: notacja `m-n' interpretowana jest jako wszystkie znaki od m do n, w porządku rosnącym. m powinno występować w porządku sortowania przed n; jeśli tak nie jest, następuje błąd. Dla przykładu, `0-9' jest tym samym co `0123456789'. Chociaż GNU tr nie obsługuje składni System V używającej nawiasów kwadratowych do zamykania zakresów, tłumaczenia określone w tym formacie nadal będą działać, o ile nawiasy w łańcuch1 odpowiadają identycznym nawiasom w łańcuch2.

Powtórzone znaki: notacja `[c*n]' w łańcuch2 interpretowana jest jako n kopii znaku c. Tak więc `[y*6]' jest tym samym co `yyyyyy'. Notacja `[c*]' w łańcuch2 rozszerzana jest na tyle kopii c, ile potrzeba na to aby zb2 był tak długi jak zb1. Jeśli n zaczyna się od 0, jest reprezentowane ósemkowo, w przeciwnym razie dziesiętnie.

Klasy znaków: notacji `[:nazwa-klasy:]' odpowiadają wszystkie znaki z (predefiniowanej) klasy zwanej nazwa-klasy. Znaki nie są rozszerzane w jakimś szczególnym porządku, z wyjątkiem klas 'upper' i Gdy podano zarówno opcję --delete (-d) jak i --squeeze-repeats (-s) w łańcuch2 można użyć każdej klasy znaków. W przeciwnym razie w łańcuch2 akceptowane są tylko klasy znaków 'upper' i 'lower', i to tylko wtedy, kiedy odpowiednie klasy 'upper' i 'lower' zostały określone na tej samej pozycji względnej w łańcuch1. Takie postępowanie określa konwersję wielkości liter. Nazwy klas podano niżej; jeśli poda się nieprawidłową nazwę klasy, powstaje błąd.

alnum
    Litery i cyfry.

alpha
    Litery.

blank
    Poziomy biały znak.

cntrl
    Znaki sterujące.

digit
    Cyfry.

graph
    Znaki drukowalne, z wyłączeniem spacji.

lower
    Małe litery.

print
    Znaki drukowalne, łącznie ze spacją.

punct
    Znaki interpunkcyjne.

space
    Pionowy lub poziomy biały znak (odstęp).

upper
    Duże litery.

xdigit
    Cyfry szesnastkowe.

Klasy równoważne: składnia `[=c=]' oznacza wszystkie znaki równoważne c, bez szczególnej kolejności. Klasy równoważne to niedawny wynalazek pomyślany dla obsługi alfabetów nie-angielskich. Jednak nie istnieje, zdaje się, standardowa metoda ich zdefiniowania lub określenia ich zawartości. Z tego powodu nie są one w pełni zaimplementowane w GNU tr; klasa równoważna każdego znaku składa się tylko z tego znaku, co obecnie czyni je konstrukcją bezużyteczną.

  TŁUMACZENIE

tr dokonuje tłumaczenia gdy podane są zarówno łańcuch1 jak i łańcuch2, a nie podano opcji --delete (-d). tr tłumaczy każdy znak swojego wejścia znajdujący się w zb1 na odpowiedni znak w zb2. Znaki, których nie ma w zb1 przepuszczane są w postaci niezmienionej. Gdy jakiś znak pojawia się więcej niż jeden raz w zb1, a odpowiadające mu znaki w zb2 nie są takie same, używany jest tylko ostatni z nich. Dla przykładu, poniższe dwa polecenia są równoważne:
    tr aaa xyz
    tr a z
Typowym zastosowaniem tr jest konwersja małych liter na duże. Można to zrobić na wiele sposobów. Oto trzy z nich:
    tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
    tr a-z A-Z
    tr '[:lower:]' '[:upper:]'
Gdy tr dokonuje tłumaczenia, zb1 i zb2 powinny normalnie być tej samej długości. Jeśli zb1 jest krótszy od zb2, dodatkowe znaki na końcu zb2 są ignorowane.

Z drugiej strony, podanie zb1 dłuższego od zb2 nie jest przewidziane: POSIX.2 mówi, że rezultat jest niezdefiniowany. W takiej sytuacji tr BSD wydłuża zb2 do długości zb1 powtarzając ostatni znak zb2 tyle razy ile potrzeba. tr z System V obcina zb1 do długości zb2.

Domyślnie, GNU tr załatwia ten przypadek tak jak robi to tr z BSD. Gdy podano opcję --truncate-set1 (-t) GNU tr obsługuje ten przypadek tak jak wersja z System V. Opcja ta jest ignorowana dla operacji innych niż tłumaczenie.

Zachowywanie się jak tr z System V w tym przypadku psuje stosunkowo częsty idiom z BSD:
    tr -cs A-Za-z0-9 '\012'
ponieważ konwertuje na znaki nowej linii tylko bajty zerowe (pierwszy element dopełnienia zb1), a nie wszystkie znaki nie-alfanumeryczne.

  ŚCISKANIE POWTÓRZEŃ I USUWANIE

Jeśli podano tylko opcję --delete (-d), tr usuwa z wejścia wszystkie znaki znajdujące się w zb1.

Jeśli podano tylko opcję --squeeze-repeats (-s), tr zastępuje w wejściu każdą sekwencję powtórzonych znaków znajdujących się w zb1 pojedynczym wystąpieniem tegoż znaku.

Jeśli podano zarówno opcję --delete jak i --squeeze-repeats, tr najpierw wykonuje wszelkie usunięcia używając zb1, potem ściska powtórzenia pozostałych znaków używając zb2.

Opcji --squeeze-repeats można także używać podczas tłumaczenia. Wówczas tr najpierw dokonuje tłumaczenia, potem ściska powtórzenia pozostałych znaków używając zb2.

Oto kilka przykładów ilustrujących różne kombinacje opcji:

Usuwanie wszystkich bajtów zerowych:
    tr -d '\000'

Umieszczenie każdego słowa w osobnej linii. Konwertuje to wszystkie znaki nie-alfanumeryczne na znaki nowej linii, potem ściska każdy łańcuch powtórzonych nowych linii w pojedynczą nową linię:
    tr -cs '[a-zA-Z0-9]' '[\n*]'

Konwersja każdej sekwencji powtórzonych nowych linii w pojedynczą nową linię:
    tr -s '\n'

Wyszukiwanie w dokumencie podwójnych wystąpień słów. Na przykład, zdarza się pisanie "do do", powtórzonych słów rozdzielonych znakiem nowej linii. Poniższy skrypt powłoki Bourne'a najpierw zamienia każdą sekwencję znaków interpunkcyjnych i znaków pustych na pojedynczy znak nowej linii. Powoduje to umieszczenie każdego "słowa" w osobnej linii. Następnie zamienia wszystkie duże litery na małe, i, na koniec, uruchamia `uniq' z opcją `-d', co powoduje wypisanie tylko słów, które były powtórzone obok siebie.
    #!/bin/sh
    cat "$@" \
       | tr -s '[:punct:][:blank:]' ' \
       | tr '[:upper:]' '[:lower:]' \
       | uniq -d

GNU tr akceptuje także następujące opcje, w kombinacji z innymi:

--help
    Wyświetla informację o stosowaniu programu i dostępnych opcjach, kończy pracę.

--version
    Wyświetla numer wersji programu i kończy pracę.

  KOMUNIKATY OSTRZEGAWCZE

Ustawienie zmiennej środowiskowej POSIXLY_CORRECT wyłącza niektóre ostrzeżenia i komunikaty o błędach, dla ścisłej zgodności z POSIX.2. Komunikaty te występują normalnie w następujących okolicznościach:

1. Gdy podano opcję --delete, ale nie --squeeze-repeats, a podano łańcuch2, GNU tr domyślnie wypisuje komunikat o użyciu i kończy pracę, ponieważ łańcuch2 nie zostałby użyty. Specyfikacja POSIX mówi, że łańcuch2 należy w tej sytuacji zignorować. Jednak milczące ignorowanie argumentów to zły pomysł.

2. Gdy podano niejednoznaczne specjalne sekwencje ósemkowe. Dla przykładu, \400 to faktycznie \40 plus cyfra 0, ponieważ ósemkowa wartość 400 nie mieści się w pojedynczym bajcie.

Zauważ że GNU tr nie zapewnia pełnej zgodności z BSD lub System V. Dla przykładu, nie istnieje opcja wyłączająca interpretację konstrukcji POSIX-owych [:alpha:], [=c=], i [c*10]. GNU tr nie usuwa także automatycznie bajtów zerowych, w odróżnieniu od tradycyjnych wersji UNIXowych, w których nie ma sposobu zachowania bajtów zerowych.

ZGŁASZANIE BŁĘDÓW
Błędy proszę zgłaszać, w jęz. ang., do <bug-textutils@gnu.org>.

COPYRIGHT
Copyright © 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ZOBACZ TAKŻE
expand(1), unexpand(1), textutils(1).

OD TŁUMACZA
Zaktualizowano i poszerzono wg dokumentacji Texinfo dla narzędzi tekstowych GNU wersji 2.0.