特定の行の後の文字列を置き換える

特定の行の後の文字列を置き換える

「task Listen」文字列を含む行の後の「edit TRIES 2」文字列を「edit TRIES 3」に置き換えたいと思います。

  task Listen
    edit TRIES 2

sedを使用してこれを行うにはどうすればよいですか? "edit TRIES 2"という文字列がファイルに複数回表示されるため、特定の行を置き換えようとするため、単純なsed置換を実行できません。

答え1

もっと簡単なのはどうですか?

sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file

前任者。与えられた

$ cat file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 2
    edit TRIES 2

それから

$ sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 3
    edit TRIES 2

答え2

または、スクリプト可能なエディタを使用してくださいed。 「Task Listen」を含む行を検索し、それ以上に移動して「edit TRIES 2」を「edit TRIES 3」に置き換えます。

printf '%s\n' '/task Listen/+1 s/edit TRIES 2/edit TRIES 3/' 'wq' | ed -s file

printf改行で区切られた2つのコマンドを次に送信しますed(診断を抑制するように求められます-s)。

  1. /task Listen/+1- "task Listen"と一致する以下の項目では、
  2. s/edit TRIES 2/edit TRIES 3/- 「edit TRIES 2」を「edit TRIES 3」に置き換えます。

"task Listen" 次の行いいえ「edit TRIES 2」を含めるとed失敗します(ファイルは変更されていません)。

答え3

私の試みは次のとおりです。

sed -E 'N;s/([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*)/\13/' file

拡張正規表現を使用してください。

sed -E

コマンドの使用N(改行)

'N;

スペースまたはタブで始まる場合は、繰り返される2行を一致させてキャプチャします。

([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*

この場合、文字列をキャプチャされたパターンと目的の文字列に置き換えます3

/\13/

答え4

次のコマンドを試してください。素晴らしい作品。

注文する

sed -n '/task Listen/,+1p' filename| sed "s/edit TRIES 2/edit TRIES 3/g"

出力

task Listen
    edit TRIES 3

関連情報