Moje otázka souvisí s sed
-specifické řešení uvedené v této odpovědi pro tuto otázku obráceného greppingu. sed
/grep
řešení, které nejsem schopen dešifrovat, je následující:
sed '1!G;h;$!d' file
Může někdo prosím rozluštit tento příkaz?
Ze znalostí VI(M) vím, že G označuje poslední řádek souboru a že v sed bang(!) následovaný adresou funguje trochu jako grep -v
to znamená, že nebude odpovídat této linii. Ale jako celek je výše uvedený inline skript sed mimo mě.
Přijatá odpověď:
Tím se obrátí soubor řádek po řádku.
sed '1!G;h;$!d' file
Nejprve sed
má zadržovací prostor a vzorový prostor . Než se soustředíme na konkrétní příkaz, musíme je rozlišovat.
Když sed
přečte nový řádek, načte se do prostoru vzoru. Proto je tato mezera přepsána při každém zpracování nového řádku. Na druhou stranu je úložný prostor konzistentní v průběhu celého zpracování a hodnoty tam mohou být uloženy pro pozdější použití.
K příkazu:
V tomto příkazu jsou 3 příkazy:1!G
, h
a $!d
-
1!G
znamená, žeG
příkaz se provede na každém řádku kromě prvního (!
neguje1
).G
znamená připojit co je v úložném prostoru do prostoru vzoru. -
h
platí pro každý řádek. Kopíruje se prostor vzoru do prostoru pro uložení (a přepíše jej). -
$!d
platí pro každý řádek kromě posledního ($
představuje poslední řádek,!
to neguje).d
je příkaz k vymazání řádku (pattern space).
- Nyní, když je přečten první řádek,
sed
provedeh
příkaz. První řádek se zkopíruje do úložného prostoru. Poté je smazán, protože odpovídá$!
stav.sed
pokračuje druhým řádkem. - Druhý řádek odpovídá podmínce
1!
(není to první řádek), a tak se zadržovací prostor (který má první řádek) připojí k prostoru vzoru (který má druhý řádek). Poté je v prostoru vzorů nyní druhý řádek, za nímž následuje první řádek, oddělený novým řádkem. Nyníh
příkaz se použije (jako na každém řádku); vše, co je v prostoru vzoru, se zkopíruje do prostoru pro uložení. Třetí příkaz ($!d
) platí:Řádek se odstraní z prostoru vzoru. - Krok 2 je nyní proveden se všemi řádky. Přeskočíme na poslední řádek.
- Na posledním řádku (
$
) téměř celý krok 2 je hotový, ale ne část odstranění (d
). ).sed
, při vyvolání bez-n
, vytiskne prostor se vzorem automaticky na konci zpracování pro každý vstupní řádek. Takže, když není vymazán, prostor se vzorem se vytiskne. Nyní obsahuje všechny řádky v obráceném pořadí .