GNU/Linux >> Znalost Linux >  >> Linux

Příznaky sed e a g nefungují společně

Vlajky spolupracují opačným způsobem, než očekáváte. Dokumentace /e je, pro záznam:

Tento příkaz umožňuje přenést vstup z příkazu shellu do prostoru vzoru. Pokud byla provedena náhrada, provede se příkaz nalezený v prostoru vzoru a prostor vzoru je nahrazen jeho výstupem. Konečný nový řádek je potlačen; výsledky jsou nedefinované, pokud příkaz, který se má provést, obsahuje znak nul. Toto je rozšíření GNU sed.

To je napsáno trochu krkolomně. Znamená to, že po dokončení s/// příkaz pro tento řádek, pokud došlo ke změně, provede se (nový) řádek jako příkaz a jeho výstup se použije jako náhrada za tento řádek.

Takže pro váš zadaný příkaz:

echo AAA | sed -r 's/A/echo B/ge'

nejprve nahradí každý A s echo B a pak provede výsledek jako příkaz. Má to (zhruba řečeno) stejný účinek jako:

echo AAA | sed -r 's/A/echo B/g' | sh

GNU sed nepodporuje přímo požadovaný režim, i když jej můžete v případě potřeby předstírat pomocí složitějšího skriptu. Případně /e v Perlu modifikátor na jeho s příkaz má chování, které hledáte, ale s výrazy v Perlu.


jste získání vícenásobné náhrady, ale nezískáte vícenásobné provedení. Vzor se provede, jakmile budou provedeny všechny náhrady.

Bez e označit výsledek

echo AAA | sed -r 's/A/echo B/g'

je

echo Becho Becho B

Takže to je příkazový řádek, který se spustí, pokud uděláte zahrnout e příznak, který je ekvivalentní

echo 'Becho Becho B'

Chcete-li získat 'BBB' z 'AAA' pomocí příkazu 's' GNU sed s příznakem 'e', ​​můžete udělat toto:

echo AAA | sed -re 's/A/echo -n B;/ge'

'AAA' je nahrazeno 'echo-nB;echo-nB; echo -n B;', který, když je nakonec proveden, vede ke 3 sekvenčně spuštěným echo příkazům, jednomu pro každou z globálních shod. Znak '-n' vynechává znaky pro odřádkování z výstupu echa, takže 'B' skončí na jednom řádku (ale sed při konečném tisku prostoru se vzorem připojí jeden odřádkování sám).


Linux
  1. echo:příkaz nenalezen

  2. sed:příkaz nenalezen

  3. Jak sudo a nohup spolupracovat

  1. Příkaz Linux Sed:Použití a příklady

  2. Linuxový příkaz 'll' nefunguje

  3. Proč můj crontab nefunguje a jak jej mohu odstranit?

  1. Grub Rescue Command. Grub nefunguje v Ubuntu 13?

  2. id:příkaz nenalezen

  3. w:příkaz nenalezen