假设我的文件中有以下行
range = a:123:234,b:333:333 (note there is a white space between the =)
我想使用sed
将333:333替换为其他内容sed s/range\s=\sa:123:234,b:333:333/range\s=\sa:123:234,b:909:141/ -i myfile.txt
但上面的命令不起作用。
我错过了什么吗?
答案 0 :(得分:2)
尝试:
sed -i 's/\(range\s=\sa:123:234,b:\)333:333/\1909:141/' myfile.txt
一些关键点:
当您在命令行取消加引号上指向\s
等表达式时,shell将首先解释它们,然后将结果传递给sed。除非这是你想要的,否则将这些表达式放在单引号中。
sed的替换命令看起来像s/old/new/
,其中old
应该是正则表达式,可能包含\s
表示空格,new
应该是替换文本。除非您想在输出中使用斜杠,否则替换文字不应包含\s
。
为了保存重新输入,从而减少错误的可能性,上面将第一行的开头部分捕获为第1组。这样,我们可以将其作为替换文本写为\1
。
sed '/range\s=\sa:123:234,b:/ s/333:333/909:141/' myfile.txt
以上选择包含range\s=\sa:123:234,b:
的行。对于那些行和仅这些行,它会替换909:141
代替第一次出现的333:333
。
答案 1 :(得分:0)
只需使用简单的sed命令即可实现结果,例如;
sed -i s/b:333:333/b:909:141/ myfile.txt
如果您如此热衷于使用完整行作为模式匹配,那么请使用如下所示;
sed s/range\ =\ a:123:234,b:333:333/range\ =\ a:123:234,b:909:141/ -i myfile.txt
两者都是一样的。只需在您要检查的空格之前使用\
。
答案 2 :(得分:0)
awk
救援:
awk -F: '/^range/{$(NF-1)="REPL1";$NF="REPL2"}1' OFS=':' input.txt
-F:
将冒号的输入行拆分为字段。给出:
range = a
123
234,b
333
333
在以range
开头的行上,我们更改了上一个$NF
和第二个$(NF-1)
字段。尾随1
是一个始终正确的条件,它使awk打印所有行。
ORS=':'
告诉awk使用冒号作为输出字段分隔符。