如何使用 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

因为您实际上并没有更改“cast”行:

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

正如 Kusalananda 评论的那样,这个命令:

  • 当找到想要的“cast”行之一时:
    • a追加新行
    • n从文件中取出ext 行(不需要的“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 '...'

相关内容