「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
)。
/task Listen/+1
- "task Listen"と一致する以下の項目では、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