GNU/Linux >> Linux の 問題 >  >> Ubuntu

「sed」コマンドを使用して、一致したパターンを変数に保存するにはどうすればよいですか?

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


Ubuntu
  1. Linuxコマンドの出力を変数に割り当てる方法

  2. Linuxでコマンド出力をファイルに保存する方法

  3. 変数に格納されているコマンドを実行するにはどうすればよいですか?

  1. コマンドプロンプトを使用してUbuntuでAnydeskを起動する方法は?

  2. コマンドラインを使用してLinuxを再起動する方法

  3. SSHのコマンドを使用してMySQLデータベースを復元するにはどうすればよいですか?

  1. コマンドラインを使用してUbuntuのバージョンを確認する方法

  2. シェルコマンドを使用してGDB内で環境変数を設定するには?

  3. Linuxシェルでcpコマンドを使用して、ディレクトリ全体を別のディレクトリにコピーするにはどうすればよいですか?