1

在 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

4 回答 4

3

以下对我有用:

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

你需要逃跑(){}

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

sed 's/^\(.\{2\}\)0/\1/'
于 2013-06-04T16:43:41.240 回答
1

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

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

检查sedUnix 机器上的手册页并查看是否有等效选项(可能-E)或转义 ERE 功能。

请参阅此处了解 BRE 和 ERE 之间的区别。

于 2013-06-04T16:42:16.910 回答
1
sed  's/^\(.\{2\}\)0\(.*\)$/\1\2/' <filename>

阅读手册以获取有关正则表达式的更多详细信息,或者只是谷歌。随机删除参数不太可能起作用(尽管“说出你尝试过的东西”的荣誉)。

于 2013-06-04T16:43:28.797 回答
1

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

所以,这有点乱,但是如果你有一个现代的 sed,那么添加 -r 标志的机会可能对你有用,如果你有一个 POSIX awk 或最近的 GNU awk,那么 RE 间隔将默认工作。

于 2013-06-04T16:52:03.317 回答