如何匹配sed中的空格?

时间:2015-11-01 04:57:44

标签: shell sed

假设我的文件中有以下行

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

但上面的命令不起作用。

我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

尝试:

sed -i 's/\(range\s=\sa:123:234,b:\)333:333/\1909:141/' myfile.txt

一些关键点:

  1. 当您在命令行取消加引号上指向\s等表达式时,shell将首先解释它们,然后将结果传递给sed。除非这是你想要的,否则将这些表达式放在单引号中。

  2. sed的替换命令看起来像s/old/new/,其中old应该是正则表达式,可能包含\s表示空格,new应该是替换文本。除非您想在输出中使用斜杠,否则替换文字应包含\s

  3. 为了保存重新输入,从而减少错误的可能性,上面将第一行的开头部分捕获为第1组。这样,我们可以将其作为替换文本写为\1

  4. 替代

    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 -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使用冒号作为输出字段分隔符。