我尝试过以下命令:-
[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 '...'