Linux

如何使用 sed 替換多行字元串?

  • June 17, 2016

我嘗試了以下命令:-

[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

但是上面的命令不起作用。有人可以指出我的錯誤。

由於您實際上並沒有更改“演員”行:

sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
               set trans_id 1
n;d}' file

正如 Kusalananda 評論的那樣,這個命令:

  • 當找到想要的“演員”行之一時:

    • a追加新行
    • 從文件中取出next 行(不需要的“set”行)
    • 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 '...'

引用自:https://unix.stackexchange.com/questions/290355