sed
を使用してパターンを見つけようとしています file.txt
のコマンド 最初のchar1の間 およびchar2 そしてそれを文字列に置き換えます。以下のようにecho
モードの例:
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
また、一致したパターンを保存する必要があります(is test
など) {<–周囲のスペースは重要です})変数内。
承認された回答:
これはsedの単一の呼び出しであり、修正された行をstdoutに書き込むと同時に、削除されたテキストをシェル変数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.
var
の値 は:
$ echo "==$var=="
== is test ==
説明:
-
h
このコマンドは、現在のパターンをホールドスペースにコピーします。
-
s/[^X]*X([^Y]*)Y.*/\1/;p
これにより、最初の
X
の間のテキストを除くすべてがパターンスペースから削除されます。 およびY
スペースを含みます。次に、これはstdoutに出力されます。これは、シェルによってキャプチャされ、var
に割り当てられる出力です。 。 -
x
これにより、ホールドスペースがパターンスペースにコピーされます。これが行われると、パターンスペースには元の入力行のコピーが含まれます。
-
s/X[^Y]*Y/REPLACE/; w /dev/stderr
置換が行われ、結果が
stderr
に書き込まれます。 。 -
2>&1
シェルがstdoutを
var
にキャプチャした後 、これはシェルにstderr(REPLACEの行がある)をstdoutにコピーするように指示します。
変数var
の処理は別として
変数var
先頭と末尾のスペースが含まれます。シェルがその後var
をサブジェクトする場合 単語分割では、これらのスペースは削除されます。これを防ぐために、var
が参照されている場合は、上記の例のように、二重引用符で囲んでください。