Příkaz rev
v Linuxu slouží k obrácení pořadí znaků v textových řetězcích. Funguje jak s textem zadaným přímo, tak s obsahem souborů. Ačkoli se zdá být jednoduchý, jeho skutečný potenciál se odhalí v kombinaci s dalšími příkazy.
Tento nenápadný nástroj provádí jedinou operaci – zrcadlově obrací text. Kromě zobrazení nápovědy pomocí -h
a verze pomocí -V
, nepřijímá žádné jiné parametry příkazové řádky.
Takže rev
jen obrací text, a to je vše? Žádné další možnosti? Ano i ne. Nemá žádné doplňující volby, ale jeho možnosti tím nekončí. Ukážeme si, jak ho využít v komplexnějších operacích.
Jeho síla se projeví, když jej použijete jako stavební prvek v složitějších příkazech. Podobně jako tac
nebo yes
, i rev
je „facilitátor“ – jeho užitečnost se projeví ve zjednodušení použití jiných příkazů.
Použití příkazu rev
Pokud spustíte rev
bez dalších parametrů, bude čekat na vstup z klávesnice, obrátí zadaný text a zobrazí jej. Bude takto pracovat, dokud nezadáte Ctrl+C.
rev
Když napíšete text a stisknete Enter, rev
zobrazí obrácený řetězec – pokud nejde o palindrom, samozřejmě.
Předávání textu příkazu rev
Text můžete do rev
poslat pomocí příkazu echo
:
echo one two three | rev
Příkaz rev
lze použít i pro obrácení obsahu celého textového souboru, řádek po řádku. V tomto případě máme soubor „filelist.txt“ obsahující seznam jmen souborů.
rev filelist.txt
Každý řádek souboru se načte, obrátí a zobrazí v terminálu.
Kombinace rev
s dalšími příkazy
Podívejme se na příklad, kde je rev
použit dvakrát:
Tento příkaz odstraní poslední znak z textového řetězce. To může být užitečné pro odstranění interpunkce. Použijeme k tomu příkaz cut
, který nám pomůže extrahovat znaky.
echo 'Remove punctuation.' | rev | cut -c 2- | rev
Rozložme si tento příkaz:
echo
pošle řetězec prvnímurev
.rev
obrátí řetězec a předá hocut
.- Volba
-c
(znaky) říkácut
, ať vrátí sekvenci znaků. - Volba
2-
říkácut
, aby vrátil rozsah znaků od druhého znaku do konce řádku. Kdybychom zadali například2-5
, vracel by se rozsah od druhého do pátého znaku. Žádné druhé číslo znamená „až do konce řetězce“. - Obrácený řetězec – bez prvního znaku – se předá dalšímu
rev
, který vrátí řetězec do původního pořadí.
Tím, že jsme ořízli první znak obráceného řetězce, jsme odstranili poslední znak původního řetězce. Jistě, můžeme to udělat i pomocí sed
nebo awk
, ale tato syntaxe je jednodušší.
Oddělení posledního slova
Podobným trikem můžeme získat poslední slovo řádku.
Příkaz se podobá předchozímu, opět využívá rev
dvakrát. Rozdíl je v tom, jak cut
vybírá části textu.
echo 'Separate the last word' | rev | cut -d' ' -f1 | rev
Zde je rozklad příkazu:
echo
pošle řetězec prvnímurev
.rev
obrátí řetězec a předá hocut
.- Volba
-d' '
(oddělovač) říkácut
, aby vracel sekvence znaků oddělené mezerou. - Volba
-f1
říkácut
, aby vrátil první část řetězce bez oddělovače, tedy první část věty až k první mezeře. - Obrácené první slovo se předá dalšímu
rev
, který vrátí řetězec do původního pořadí.
Tím, že jsme extrahovali první slovo obráceného řetězce, jsme získali poslední slovo původního řetězce. Poslední slovo věty bylo „word“, a to jsme si vytiskli.
Ořezávání obsahu ze souborů
Představme si, že máme soubor obsahující seznam jmen souborů v uvozovkách. Chceme tyto uvozovky odstranit.
Podívejme se na obsah souboru:
less filelist.txt
Soubor se nám zobrazí pomocí less
.
K odstranění interpunkce z obou konců řádků můžeme použít následující příkaz. Využívá dvakrát rev
a cut
:
rev filelist.txt | cut -c 2- | rev | cut -c 2-
Jména souborů jsou vypsána bez uvozovek.
Rozklad příkazu:
rev
obrátí řádky v souboru a předá jecut
.- Volba
-c
(znaky) říkácut
, ať vrátí sekvenci znaků z každého řádku. - Volba
2-
říkácut
, ať vrátí rozsah znaků od druhého znaku do konce každého řádku. - Obrácené řetězce, mínus jejich první znaky, se předají
rev
. rev
obrátí řetězce zpět do původního pořadí a výstup se znovu ořízne pomocícut
.- Volba
-c
říkácut
ať vrací sekvenci znaků. - Volba
2-
opět říká, ať se vrátí rozsah znaků od druhého znaku po konec řádku. Tím „přeskočíme“ uvozovku, která je první znak na každém řádku.
Rozsáhlé řetězení příkazů
Zde je příkaz, který vrátí setříděný seznam všech přípon souborů v aktuálním adresáři, využívající pět různých příkazů Linuxu:
ls | rev | cut -d'.' -f1 | rev | sort | uniq
Postup je následující:
ls
vypíše soubory v aktuálním adresáři a výstup se předárev
.rev
obrátí jména souborů a předá jecut
.cut
vrátí první část každého jména souboru až po oddělovač.-d'.'
říkácut
, ať používá tečku „.“ jako oddělovač. První část obrácených jmen souborů, až k první tečce, jsou přípony souborů. Výstup se předárev
.rev
obrátí přípony souborů do původního pořadí. Ty jsou poté setříděny.sort
setřídí přípony a výsledek je předán douniq
.uniq
vrátí jeden výpis pro každý unikátní typ přípony souboru. Pokud soubor nemá příponu (například makefile nebo adresáře Help a gc_help), je uveden celý název souboru.
Nakonec můžeme do uniq
přidat volbu -c
(count) pro zobrazení počtu výskytů:
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
Nyní získáme seznam různých typů souborů v aktuálním adresáři, s počtem výskytů každého z nich.
Je to docela šikovný jednorádkový příkaz!
Závěr
Někdy je potřeba jít zpět, abychom se mohli posunout vpřed. A obvykle se nejrychleji dostaneme vpřed, když jsme součástí týmu.
Přidejte rev
do svého arzenálu příkazů a brzy ho budete používat ke zjednodušení i jinak složitých příkazových sekvencí.