在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/
我觉得有一个简单的解决办法,但我无法弄明白。
答案 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间隔将默认工作