UNIX vs linux上的sed问题

时间:2013-06-04 16:38:16

标签: shell sed awk

在Linux中我可以运行命令:

sed -r 's/^(.{2})0(.*)$/\1\2/' filename

然而,当在UNIX中运行时我不能-r所以我尝试了:

sed  's/^(.{2})0(.*)$/\1\2/' filename 

我收到以下错误:

sed: command garbled: s/^(.{2})0(.*)$/\1\2/

我觉得有一个简单的解决办法,但我无法弄明白。

4 个答案:

答案 0 :(得分:3)

以下内容对我有用:

sed 's/^\(.\{2\}\)0\(.*\)$/\1\2/'

您需要转义(){}

编辑:这也将解决您的问题,并且更短。无需继续搜索到行尾。

sed 's/^\(.\{2\}\)0/\1/'

答案 1 :(得分:1)

量词语法{n,m}和捕获组是扩展正则表达式类的一部分。默认情况下,sed仅使用基本正则表达式。如果您阅读Linux系统上的手册页,您将清楚地看到-r的作用:

-r, --regexp-extended            use extended regular expressions in the script.

检查Unix框中sed的手册页,看看是否有等效选项(可能是-E)或者逃避ERE功能。

有关BRE和ERE之间的差异,请参阅here

答案 2 :(得分:1)

sed  's/^\(.\{2\}\)0\(.*\)$/\1\2/' <filename>

阅读手册以获取有关正则表达式的更多详细信息,或只是谷歌。随机删除参数不太可能起作用(虽然为#34;表示你尝试了什么&#34;)。

答案 3 :(得分:1)

并非所有seds都是平等的。像.{2}这样的RE区间表达式是现代扩展正则表达式(ERE)的一部分,而sed历史上支持基本正则表达式(BRE)。某些机器上的某些seds根本不支持ERE,因此您需要将表达式重新编写为BRE(..)或切换到其他工具。一旦你使用了这个新工具,你仍然会遇到问题,因为“RE Intervals”是ERE的一个相对较新的补充,因此即使使用支持ERE的awk等工具,也不是所有的awks都支持RE Intervals。有些seds会通过在大括号前放置后退来支持RE Intervals,有些会通过添加像-r这样的标志来支持它们,以告诉sed {2}表示RE间隔而非字面{2}。

所以,它有点混乱但是如果你有一个现代的sed然后机会添加-r标志将适合你,如果你有一个POSIX awk或最近的GNU awk那么RE间隔将默认工作