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).