假设我的文件中有以下行
range = a:123:234,b:333:333 (note there is a white space between the =)
sed -i 's/\(range\s=\sa:123:234,b:\)333:333/\1909:141/' myfile.txt
一些关键点:
替代
sed '/range\s=\sa:123:234,b:/ s/333:333/909:141/' myfile.txt
以上选择包含range\s=\sa:123:234,b:
的行。对于那些行和仅这些行,它会替换909:141
代替第一次出现的333:333
-
当您在命令行取消加引号上指向
\s
等表达式时,shell将首先解释它们,然后将结果传递给sed。除非这是你想要的,否则将这些表达式放在单引号中。 -
sed的替换命令看起来像
s/old/new/
,其中old
应该是正则表达式,可能包含\s
表示空格,new
应该是替换文本。除非您想在输出中使用斜杠,否则替换文字不应包含\s
。 -
为了保存重新输入,从而减少错误的可能性,上面将第一行的开头部分捕获为第1组。这样,我们可以将其作为替换文本写为
\1
。
例如找到pam_wheel.so use_uid行并且替换掉该行中#auth为auth命令如下,用/s作为空格
sed -i '/pam_wheel.so\suse_uid/ s/#auth/auth/' zzz
在ansible中执行时 sed -i 内的命令要改成双引号,不然会报错
[oracle@wlkdb2 ~]$ ansible db -m shell -a 'sed -i "/pam_wheel.so\suse_uid/ s/#auth/auth/" /etc/pam.d/su' -b --become-method su --become-user root --ask-become-pass
参考:
https://www.thinbug.com/q/33459358