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í:
-
h
Tento příkaz zkopíruje aktuální vzor do úložného prostoru.
-
s/[^X]*X([^Y]*)Y.*/\1/;p
Tím se z prostoru vzoru odstraní vše kromě textu mezi prvním
X
aY
včetně případných mezer. To se pak vytiskne na stdout. Toto je výstup, který je zachycen shellem a přiřazen kvar
. -
x
Toto 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/stderr
Provede se substituce a výsledek se zapíše do
stderr
. -
2>&1
Poté, 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.