Jak korzystać z polecenia Linux tr
Opublikowany: 2023-05-17Czy potrzebujesz bezproblemowej metody manipulowania strumieniem tekstu w systemie Linux? Nie szukaj dalej niż polecenie tr, które może zaoszczędzić czas na zastępowaniu, usuwaniu, łączeniu i kompresji tekstu wejściowego. Tak to się robi.
Co to jest polecenie tr?
Zastępowanie znaków
Korzystanie z zakresów i tokenów
Odwracanie dopasowań
Usuwanie i ściskanie znaków
Usuwanie znaków
Łączenie i dzielenie linii
Używanie tr z potokami
Proste jest równie proste
Co to jest polecenie tr?
Polecenie Linux tr
to szybkie i proste narzędzie do usuwania niechcianych znaków ze strumieni tekstu oraz do innych zgrabnych sztuczek manipulacyjnych. Swoją nazwę zawdzięcza słowu „translate”, a korzenie tr
sięgają głęboko tradycji uniksowej.
Jak wszyscy wiemy, Linux to open-source przepisany Unix. Dodaje też własne rzeczy do miksu. Nie jest klonem bajt po bajcie, ale najwyraźniej czerpie wiele ze swoich zasad projektowania i sterowania inżynieryjnego z systemu operacyjnego Unix.
Chociaż jak dotąd tylko dwie dystrybucje Linuksa uzyskały certyfikat zgodności z POSIX i zostały oficjalnie zaakceptowane jako implementacje Uniksa — EulerOS i Inspur K-UX — Linux prawie całkowicie wyparł Uniksa w świecie biznesu.
Wszystkie dystrybucje Linuksa, przynajmniej w swoich podstawowych narzędziach, są zgodne z filozofią Uniksa. Filozofia Uniksa zawiera w sobie wizję, jaką pionierzy Uniksa mieli dla swojego nowego systemu operacyjnego. Często jest to parafrazowane jako „Pisz programy, które dobrze wykonują jedną rzecz”. Ale chodzi o coś więcej.
Jedną z najpotężniejszych innowacji było to, że programy powinny generować dane wyjściowe, które można wykorzystać jako dane wejściowe do innych programów. Możliwość łączenia łańcuchowego narzędzi wiersza poleceń, przy użyciu strumienia wyjściowego z jednego programu jako strumienia wejściowego do następnego programu w linii, jest niezwykle potężna.
Czasami będziesz chciał dostroić lub poprawić dane wyjściowe z jednego programu, zanim dotrą one do następnego programu w kolejce. A może nie pobierasz danych wejściowych z narzędzia wiersza poleceń Linuksa, przesyłasz strumieniowo tekst z pliku, który nie został utworzony z myślą o Twoich konkretnych potrzebach.
W tym miejscu tr
przychodzi samo. Pozwala wykonać zestaw prostych transformacji na jego strumieniu wejściowym, aby wytworzyć jego strumień wyjściowy. Ten strumień wyjściowy można przekierować do pliku, wprowadzić do innego programu linuksowego lub nawet do innej instancji tr
, aby zastosować do strumienia wiele transformacji.
Zastępowanie znaków
Komenda tr
działa na swoim strumieniu wejściowym zgodnie z regułami. Używany bez żadnych opcji wiersza poleceń, domyślnym działaniem tr
jest zastępowanie znaków w strumieniu wejściowym innymi znakami.
Polecenia do tr
zwykle wymagają dwóch zestawów znaków. Pierwszy zestaw zawiera znaki, które zostaną zastąpione, jeśli zostaną znalezione w strumieniu wejściowym. Drugi zestaw zawiera znaki, którymi zostaną zastąpione.
Sposób, w jaki to działa, polega na tym, że wystąpienia pierwszego znaku w zestawie pierwszym zostaną zastąpione pierwszym znakiem w zestawie drugim. Wystąpienia drugiego znaku w zestawie pierwszym zostaną zastąpione drugim znakiem w zestawie drugim i tak dalej.
Ten przykład wyszuka literę „c” w strumieniu wejściowym do tr
i zastąpi każde wystąpienie literą „z”. Zauważ, że tr
rozróżnia wielkość liter.
Używamy echo
, aby wepchnąć trochę tekstu do tr
.
echo abcdefabc | tr 'c' 'z'
Wszystkie wystąpienia „c” są zastępowane przez „z”, a nowy ciąg jest zapisywany w oknie terminala.
Tym razem wyszukamy dwie litery „a” i „c”. Pamiętaj, że nie szukamy hasła „ac”. Szukamy „a”, a następnie szukamy „c”. Zastąpimy każde wystąpienie „a” przez „x” i każde wystąpienie „c” przez „z”.
echo abcdefabc | tr 'ac' 'xz'
Aby to zadziałało, musisz mieć taką samą liczbę znaków w obu zestawach. Jeśli tego nie zrobisz, otrzymasz przewidywalne, ale prawdopodobnie niechciane zachowanie.
echo „mów mi Ismael”. | tr 'abcdjklm' '123'
W zestawie pierwszym jest więcej postaci niż w zestawie drugim. Litery od „d” do „m” nie mają odpowiedniego znaku w zestawie drugim. Nadal będą zastępowane, ale wszystkie zostaną zastąpione ostatnią postacią w zestawie drugim.
Jest prawie możliwe, że może to być przydatne w niektórych przypadkach, ale jeśli chcesz temu zapobiec, możesz użyć opcji -t
(truncate). To zastępuje tylko te znaki zawarte w zestawie pierwszym, które mają pasujący znak w zestawie drugim.
echo „mów mi Ismael”. | tr -t 'abcdjklm' '123'
Korzystanie z zakresów i tokenów
Zestaw jeden i zestaw dwa mogą zawierać zakresy znaków. Na przykład [az]
reprezentuje wszystkie małe litery, a [AZ]
wszystkie wielkie litery. Możemy to wykorzystać do zmiany wielkości liter w strumieniu tekstu.
Spowoduje to konwersję strumienia wejściowego na wielkie litery.
echo „Jak to zrobić” | tr '[az]' '[AZ]'
Aby odwrócić przypadek w innym kierunku, możemy użyć tego samego polecenia, ale z zamienionymi zakresami wielkich i małych liter w wierszu poleceń.
echo „Jak to zrobić” | tr '[AZ]' '[az]'
Istnieją tokeny, których możemy użyć w niektórych typowych przypadkach, do których możemy chcieć dopasować.
- [:alnum:] : Litery i cyfry.
- [:alpha:] : Tylko litery.
- [:cyfra:] : Tylko cyfry.
- [:blank:] : Tabulatory i spacje.
- [:space:] : Wszystkie spacje, w tym znaki nowej linii.
- [:graph:] : Wszystkie znaki, w tym symbole, ale bez spacji.
- [:print:] : Wszystkie znaki, w tym symbole, w tym spacje.
- [:punct:] : Wszystkie znaki interpunkcyjne.
- [:lower:] : Małe litery.
- [:upper:] : Wielkie litery.
Konwersję małych liter na duże i wielkie na małe możemy wykonać równie łatwo, używając tokenów.
echo „Jak to zrobić” | tr '[:dolny:]' '[:górny:]'
echo „Jak to zrobić” | tr '[:górny:]' '[:dolny:]'
Odwracanie dopasowań
Opcja -c
(dopełnienie) dopasowuje wszystkie znaki oprócz tych z pierwszego zestawu. To polecenie konwertuje wszystko poza literą „c” na myślnik ” -
„.
echo abcdefc | tr -c 'c' '-'
To polecenie dodaje literę „a” do pierwszego zestawu. Wszystko poza „a” lub „c” jest konwertowane na znak myślnika „ -
”.
echo abcdefc | tr -c 'ac' '-'
Usuwanie i ściskanie znaków
Możemy użyć tr
aby całkowicie usunąć znaki, bez żadnego zastępowania.
To polecenie używa opcji -d
(usuń), aby usunąć wszelkie wystąpienia „a”, „d” lub „f” ze strumienia wejściowego.
echo abcdefc | tr -d 'adf'
Jest to jeden przypadek, w którym mamy tylko jeden zestaw znaków w wierszu poleceń, a nie dwa.
Innym jest użycie opcji -s
(powtórzenia wciśnięcia). Ta opcja redukuje powtarzające się znaki do pojedynczego znaku.
Ten przykład zredukuje powtarzające się sekwencje znaku spacji do pojedynczej spacji.
echo "abc de fc" | tr -s '[:puste:]'
To trochę mylące, że token [:blank:]
reprezentuje znak spacji, a token [:space:]
reprezentuje wszystkie formy spacji, w tym tabulatory i znaki nowej linii.
W takim przypadku moglibyśmy zastąpić [:blank:]
przez [:space:]
i uzyskać ten sam wynik.
echo "abc de fc" | tr -s '[:spacja:]'
Usuwanie znaków
Różnice między [:blank:]
i [:space:]
stają się widoczne, gdy usuniemy znaki. Aby to zrobić, używamy opcji -d
(delete) i dostarczamy zestaw znaków, których tr
będzie szukać w swoim strumieniu wejściowym. Wszystkie znalezione elementy są usuwane.
echo "abc de fc" | tr -d '[:puste:]'
Spacje zostaną usunięte. Zauważ, że znak nowej linii otrzymujemy po zapisaniu strumienia wyjściowego w oknie terminala. Jeśli powtórzymy to polecenie i użyjemy [:space:]
zamiast spacji, otrzymamy inny wynik.
echo "abc de fc" | tr -d '[:puste:]'
Tym razem nie zaczynamy nowej linii po wyjściu, wiersz polecenia jest do niego przystawiony. Dzieje się tak, ponieważ [:space:]
zawiera znaki nowej linii. Wszystkie spacje, tabulatory i znaki nowego wiersza są usuwane ze strumienia wejściowego.
Oczywiście możesz również użyć rzeczywistej postaci spacji.
echo "abc de fc" | tr -d ''
Równie łatwo możemy usuwać cyfry.
echo abcd123efg | tr -d '[:cyfra:]'
Łącząc opcje -c
(uzupełnianie) i -d
(usuwanie) możemy usunąć wszystko oprócz cyfr.
echo abcd123efg | tr -cd '[:cyfra:]'
Zauważ, że wszystko poza cyframi oznacza wszystkie litery i wszystkie spacje, więc po raz kolejny tracimy końcową nową linię.
Łączenie i dzielenie linii
Jeśli zastąpimy spacje znakami nowej linii, możemy podzielić wiersz tekstu i umieścić każde słowo w osobnym wierszu.
echo 'jeden dwa trzy cztery' | tr ' ' '\n'
Możemy również zmienić ogranicznik oddzielający słowa. To polecenie zastępuje spacje dwukropkami ” :
”.
echo 'jeden dwa trzy cztery' | tr ' ' ':'
Możemy znaleźć używany ogranicznik i zastąpić go znakami nowego wiersza, dzieląc trudny do odczytania tekst na łatwiejsze do zarządzania dane wyjściowe.
Zmienna środowiskowa path jest długim ciągiem wielu ścieżek do katalogów. Dwukropek ” :
” oddziela każdą ścieżkę. Zamienimy je na znaki nowej linii.
echo $PATH
echo $PATH | tr ":" "\n"
O wiele łatwiej jest to przeanalizować wizualnie.
Jeśli mamy dane wyjściowe, które chcemy przeformatować w pojedynczą linię, również możemy to zrobić. Plik „lines.txt” zawiera tekst, po jednym słowie w każdym wierszu. Przekażemy to do tr
i przekonwertujemy na pojedynczą linię.
kot pliki.txt
kot linie.txt | tr '\n' ' '
Używanie tr z potokami
Możemy użyć danych wyjściowych z tr
jako danych wejściowych dla innego programu lub nawet dla samego tr
.
To polecenie używa tr
cztery razy.
- Pierwszy
tr
usuwa wszystkie łączniki „-” z danych wejściowych. - Drugi
tr
ściska powtarzające się spacje w pojedyncze spacje. - Trzeci
tr
zastępuje spacje znakami podkreślenia „_”. - Czwarty i ostatni
tr
konwertuje łańcuch na małe litery.
echo "Zniekształcona NAZWA PLIKU.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:górny:]' '[:dolny:]'
POWIĄZANE: Jak używać potoków w systemie Linux
Proste jest równie proste
Polecenie tr
jest świetne, ponieważ jest proste. Nie ma wiele do nauczenia się ani zapamiętania. Ale jego prostota może być również jego upadkiem.
Nie popełnij błędu, często przekonasz się, że tr
pozwala ci robić to, czego potrzebujesz, bez konieczności sięgania po bardziej skomplikowane narzędzia, takie jak sed
.
Jeśli jednak masz trudności z zrobieniem czegoś z tr
i budujesz długie łańcuchy poleceń, prawdopodobnie powinieneś używać sed
.