sed并没有抓住所有双打组合

时间:2017-07-30 05:21:43

标签: shell sed

我已经写了sed脚本,用^^替换所有NULL。虽然sed似乎只捕获了一对,但不包括该对中的第二个,因为它继续搜索。

echo "^^^^" | sed 's/\^\^/\^NULL\^/g'

产生

^NULL^^NULL^

什么时候应该产生

^NULL^NULL^NULL^

2 个答案:

答案 0 :(得分:4)

尝试使用循环将命令再次应用于修改的模式空间:

echo "^^^^" | sed ':a;s/\^\^/\^NULL\^/;t a;'

要在OSX上编辑文件,请尝试-i标志和多行命令:

sed -i '' ':a
s/\^\^/\^NULL\^/
t a' file

使用GNU sed:

sed -i ':a;s/\^\^/\^NULL\^/;t a;' file

或者只是在重命名命令之前将命令重定向到临时文件:

sed ':a;s/\^\^/\^NULL\^/;t a;' file > tmp && mv tmp file

答案 1 :(得分:1)

我非常喜欢SLePort解决方案,但由于它不适合您,您可以尝试(在Linux上测试,而不是Mac):

echo "^^^^" | sed 's/\^\^/\^NULL\^/g; s//\^NULL\^/g'

它与前一种解决方案的作用相同,但明确地说,不是使用标记循环。

您可以省略第二个命令中的模式,sed将使用上一个模式。