GNU/Linux >> Znalost Linux >  >> Linux

Jak příkaz Sed ‚1!g;h;$!d‘ obrátí obsah souboru?

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 sedzadrž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á, že G příkaz se provede na každém řádku kromě prvního (! neguje 1 ). 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).

  1. Nyní, když je přečten první řádek, sed provede h 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.
  2. 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.
  3. Krok 2 je nyní proveden se všemi řádky. Přeskočíme na poslední řádek.
  4. 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í .
Související:Oprava binárního souboru pomocí dd?
Linux
  1. Jak používat příkaz sed pro Linux

  2. Jak extrahovat soubor tar.gz v Linuxu pomocí příkazového řádku

  3. Jak se připojit z příkazového řádku jako Nautilus?

  1. Jak číst předposlední řádek v souboru pomocí Bash?

  2. Příkaz sed pro Linux nemění cílový soubor

  3. Jak získat adresu URL souboru Dropbox z příkazového řádku?

  1. Jak vložit text před první řádek souboru?

  2. Jak předat obsah souboru jako parametr příkazového řádku?

  3. Jak funguje Tee Command?