Jak korzystać z polecenia Linux tr

Opublikowany: 2023-05-17
Ekran startowy Ubuntu Linux na laptopie
Jordan Gloor / How-To Geek
Komenda tr wykonuje transformacje na strumieniu tekstu, tworząc nowy strumień jako swoje wyjście. Możesz zastępować, usuwać lub konwertować znaki zgodnie z regułami ustawionymi w wierszu poleceń.

Czy 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.

Spis treści

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' 

Zamiana pojedynczego znaku na tr

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' 

Usuwanie dwóch liter za pomocą tr

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' 

Używanie niezrównoważonych zestawów znaków z tr

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' 

Używanie niezrównoważonych zestawów znaków z tr z opcją obcięcia

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]' 

Używanie zakresów znaków do konwersji ciągu znaków na wielkie litery

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]' 

Używanie zakresów znaków do konwersji ciągu znaków na małe litery

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:]' 

Używanie tokenów do zmiany wielkości liter w ciągach tekstowych

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' '-' 

Zastąpienie wszystkich znaków oprócz określonych innymi znakami

To polecenie dodaje literę „a” do pierwszego zestawu. Wszystko poza „a” lub „c” jest konwertowane na znak myślnika „ - ”.

 echo abcdefc | tr -c 'ac' '-' 

Zastąpienie wszystkich znaków z wyjątkiem określonych wielu znaków innymi znakami

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' 

Usuwanie wielu znaków z ciągu tekstu za pomocą tr

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:]' 

Zmiana powtarzających się sekwencji znaków na pojedyncze wystąpienie znaku za pomocą tr

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:]' 

Zmiana powtarzających się sekwencji znaków na pojedyncze wystąpienie znaku za pomocą tr

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:]' 

Usuwanie spacji (znaków spacji) z ciągu tekstowego za pomocą tr

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:]' 

Usuwanie białych znaków z ciągu tekstu za pomocą tr

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 '' 

Usuwanie spacji z ciągu tekstowego przez podanie znaku spacji za pomocą tr

Równie łatwo możemy usuwać cyfry.

 echo abcd123efg | tr -d '[:cyfra:]' 

Usuwanie cyfr z ciągu tekstowego za pomocą tr

Łącząc opcje -c (uzupełnianie) i -d (usuwanie) możemy usunąć wszystko oprócz cyfr.

 echo abcd123efg | tr -cd '[:cyfra:]' 

Usuwanie wszystkiego oprócz cyfr z ciągu tekstu za pomocą tr

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' 

Podział wiersza tekstu na jedno słowo w wierszu za pomocą tr

Możemy również zmienić ogranicznik oddzielający słowa. To polecenie zastępuje spacje dwukropkami ” : ”.

 echo 'jeden dwa trzy cztery' | tr ' ' ':' 

Zmiana separatora słów ze spacji na dwukropki za pomocą 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" 

Podział zmiennej środowiskowej $PATH na osobne ścieżki do katalogów, po jednej w wierszu, za pomocą tr

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' ' ' 

Łączenie wielowierszowych danych wejściowych w jeden wiersz tekstu za pomocą tr

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:]' 

Potok czterech wystąpień tr

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 .

Jak korzystać z polecenia sed w systemie Linux
POWIĄZANE Jak korzystać z polecenia sed w systemie Linux

Jeśli jednak masz trudności z zrobieniem czegoś z tr i budujesz długie łańcuchy poleceń, prawdopodobnie powinieneś używać sed .