Snažím se najít vzor pomocí sed příkaz v file.txt mezi prvním znakem1 a char2 a pak to nahraďte řetězcem. jako níže pomocí echo příklad režimu:
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
Také musím uložit odpovídající vzor (jako is test {<–mezery kolem jsou důležité} ) v proměnné.
Přijatá odpověď:
Zde je jediné vyvolání sed, které zapíše revidovaný řádek do stdout a zároveň uloží odstraněný text do proměnné shellu var :
$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
Hodnota var je:
$ echo "==$var=="
== is test ==
Vysvětlení:
-
hTento příkaz zkopíruje aktuální vzor do úložného prostoru.
-
s/[^X]*X([^Y]*)Y.*/\1/;pTím se z prostoru vzoru odstraní vše kromě textu mezi prvním
XaYvčetně případných mezer. To se pak vytiskne na stdout. Toto je výstup, který je zachycen shellem a přiřazen kvar. -
xToto zkopíruje zadržovací prostor zpět do prostoru vzoru. Když je toto hotovo, prostor vzoru obsahuje kopii původního vstupního řádku.
-
s/X[^Y]*Y/REPLACE/; w /dev/stderrProvede se substituce a výsledek se zapíše do
stderr. -
2>&1Poté, co shell zachytil stdout do
var, toto instruuje shell, aby zkopíroval stderr (který má řádek s REPLACE) do stdout.
Pomineme-li manipulaci s proměnnou var
Proměnná var zahrnuje úvodní a koncové mezery. Pokud by shell následně podléhal var k dělení slov by tyto mezery byly odstraněny. Chcete-li tomu zabránit, když var je odkazováno, udělejte to uvnitř dvojitých uvozovek, jako ve výše uvedeném příkladu.