sedを使用して複数行の文字列を置き換える方法は? [閉鎖]

sedを使用して複数行の文字列を置き換える方法は? [閉鎖]

私は次のコマンドを試しました: -

[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 '...'

おすすめ記事