tr
je nástroj příkazového řádku v systémech Linux a Unix, který překládá, maže a mačká znaky ze standardního vstupu a zapisuje výsledek na standardní výstup.
tr
příkaz může provádět operace, jako je odstranění opakovaných znaků, převod velkých písmen na malá a nahrazení a odstranění základních znaků. Obvykle se používá v kombinaci s dalšími příkazy prostřednictvím potrubí.
V tomto tutoriálu vám ukážeme, jak používat tr
pomocí praktických příkladů a podrobných vysvětlení nejběžnějších možností.
Jak používat tr
Příkaz #
Syntaxe pro tr
příkaz je následující:
tr OPTION... SET1 [SET2]
tr
přijímá dvě sady znaků, obvykle o stejné délce, a nahradí znaky prvních sad odpovídajícími znaky z druhé sady.
SET
je v podstatě řetězec znaků, včetně speciálních znaků se speciálním zpětným lomítkem.
V následujícím příkladu tr
nahradí všechny znaky ze standardního vstupu (linuxize) mapováním znaků z první sady na odpovídající znaky z druhé sady.
echo 'linuxize' | tr 'lin' 'red'
Každý výskyt l
je nahrazeno r
, i
s e
a n
s d
:
reduxeze
Znakové sady lze také definovat pomocí rozsahů znaků. Například místo psaní:
echo 'linuxize' | tr 'lmno' 'wxyz'
můžete použít:
echo 'linuxize' | tr 'l-n' 'w-z'
Když -c
(--complement
) je použita volba tr
nahradí všechny znaky, které nejsou v SET1.
V níže uvedeném příkladu budou všechny znaky kromě „li“ nahrazeny posledním znakem z druhé sady:
echo 'linuxize' | tr -c 'li' 'xy'
liyyyiyyy
Jak jste si mohli všimnout, výstup výše má jeden viditelnější znak než vstup. Důvodem je echo
příkaz vypíše neviditelný znak nového řádku \n
to je také nahrazeno y
. Chcete-li opakovat řetězec bez nového řádku, použijte -n
možnost.
-d
(--delete
) říká tr
pro vymazání znaků specifikovaných v SET1. Při odstraňování znaků bez zmáčknutí zadejte pouze jednu sadu.
Níže uvedený příkaz odstraní l
, i
a z
znaky:
echo 'Linuxize' | tr -d 'liz'
L
znak není odstraněn, protože vstup obsahuje velké L
zatímco l
znak v SET je malé písmeno.
Lnuxe
-s
(--squeeze-repeats
) nahradí posloupnost opakovaných výskytů znakovou sadou v poslední SET.
V následujícím příkladu tr
odstraní opakované mezery:
echo "GNU \ Linux" | tr -s ' '
GNU \ Linux
Při použití SET2 je sekvence znaků specifikovaná v SET1 nahrazena SET2.
echo "GNU \ Linux" | tr -s ' ' '_'
GNU_\_Linux
-t
(--truncate-set1
) volba vynutí tr
zkrátit SET1 na délku SET2 před dalším zpracováním.
Ve výchozím nastavení, pokud je SET1 větší než SET2 tr
znovu použije poslední znak SET2. Zde je příklad:
echo 'Linux ize' | tr 'abcde' '12'
Výstup ukazuje, že znak e
z SET1 se shoduje s posledním znakem SET2, což je 2
:
Linux iz2
Nyní použijte stejný příkaz s -t
možnost:
echo 'Linux ize' | tr -t 'abcde' '12'
Linux ize
Můžete vidět, že jsou odstraněny poslední tři znaky SET1. SET1 se změní na ‚ab‘, má stejnou délku jako SET2 a neprovede se žádná výměna.
Kombinace možností #
tr
příkaz také umožňuje kombinovat jeho možnosti. Například následující příkaz nejprve nahradí všechny znaky kromě i
s 0
a poté zmáčkne opakované 0
znaky:
echo 'Linux ize' | tr -cs 'i' '0'
0i0i0
Příklady příkazů Tr #
V této části pokryjeme několik příkladů běžného použití tr
příkaz.
Převést malá písmena na velká #
Převod malých písmen na velká nebo obrácená je jedním z typických případů použití tr
příkaz. [:lower:]
odpovídá všem malým písmenům a [:upper:]
odpovídá všem velkým písmenům.
echo 'Linuxize' | tr '[:lower:]' '[:upper:]'
LINUXIZE
Místo tříd znaků můžete také použít rozsahy:
echo 'Linuxize' | tr 'a-z' 'A-Z'
Chcete-li převést velká písmena na malá, jednoduše přepněte místa sad.
Odebrat všechny nečíselné znaky #
Následující příkaz odebere všechny nečíselné znaky:
echo "my phone is 123-456-7890" | tr -cd [:digit:]
[:digit:]
zastupuje všechny číselné znaky a pomocí -c
příkaz odstraní všechny nečíslicové znaky. Výstup bude vypadat takto:
1234567890
Vložte každé slovo na nový řádek #
Abychom vložili každé slovo na nový řádek, musíme porovnat všechny nealfanumerické znaky a nahradit je novým řádkem:
echo 'GNU is an operating system' | tr -cs '[:alnum:]' '\n'
GNU
is
an
operating
system
Odstranit prázdné řádky #
Chcete-li odstranit prázdné řádky, jednoduše stiskněte opakující se znaky nového řádku:
tr -s '\n' < file.txt > new_file.txt
V příkazu výše používáme symbol přesměrování <
pro předání obsahu file.txt
do tr
příkaz. Přesměrování >
zapíše výstup příkazu do new_file.txt
.
Tisk $PATH
adresáře na samostatném řádku #
$PATH
Environment variable je dvojtečkou oddělený seznam adresářů, který říká shellu, které adresáře má hledat spustitelné soubory, když napíšete příkaz.
Abychom mohli vytisknout každý adresář na samostatný řádek, musíme zadat dvojtečku (:
) a nahraďte jej novým řádkem:
echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
Závěr č.
tr
je příkaz pro překlad nebo mazání znaků.
Ačkoli je to velmi užitečné, tr
může pracovat pouze s jednotlivými znaky. Pro složitější porovnávání vzorů a manipulaci s řetězci byste měli použít sed
nebo awk
.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.