![sedを使用して複数行の文字列を置き換える方法は? [閉鎖]](https://linux33.com/image/9178/sed%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E8%A1%8C%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
私は次のコマンドを試しました: -
[root@10 bin]# cat temp
asdjahskjdhajksdhjkashjahfksjdhfkjsddhflkdsjhfklsdajhfklajshdkjalsdlkjasdhkljas
hskdajkdhkjas
cast $recv $UE_CAPABILITY_ENQUIRY
set trans_id [ string range $recv 42 43 ]
[root@10 bin]# sed -ir '/^cast \$recv \$UE_CAPABILITY_ENQUIRY$/{$!{N;s/^cast \$recv \$UE_CAPABILITY_ENQUIRY\nset trans_id \[ string range \$recv 42 43 \]$/cast \$recv \$UE_CAPABILITY_ENQUIRY \nset trans_id 1/;ty;P;D;:y}}' temp
変えたい
cast $recv $UE_CAPABILITY_ENQUIRY
set trans_id [ string range $recv 42 43 ]
そして
cast $recv $UE_CAPABILITY_ENQUIRY
set trans_id 1
ただし、上記のコマンドは機能しません。誰かが私の間違いを指摘できますか?
答え1
実際には「キャスト」行を変更しないので:
sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
set trans_id 1
n;d}' file
Kusalanandaが述べたように、このコマンドは次のとおりです。
- 目的の「キャスト」行の1つが見つかった場合:
a
新しい行を追加n
ファイルから追加の行を削除する(不要な「設定」行)- そして
d
削除
振り返ってみると、削除された行が削除したい行であることは確認されません。私はそれを次のように変更します:
sed '
/cast \$recv \$UE_CAPABILITY_ENQUIRY/ {
n
/set trans_id \[ string range \$recv 42 43 \]/ {
i\
set trans_id 1
d
}
}
' file
ファイル再帰の場合:
find . type f | xargs sed -i '' -e '...'
GNUツールを使用してより安全に
find . type f -print0 | xargs -0 sed -i '' -e '...'