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 が参照されている場合は、上記の例のように、二重引用符で囲んでください。