在 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/
我觉得有一个简单的解决方法,但我无法弄清楚。
以下对我有用:
sed 's/^\(.\{2\}\)0\(.*\)$/\1\2/'
你需要逃跑(){}
编辑:这也将解决您的问题并且更短。无需继续搜索到行尾。
sed 's/^\(.\{2\}\)0/\1/'
量词语法{n,m}
和捕获组是扩展的正则表达式类的一部分。默认情况下sed
只使用基本的正则表达式。如果您阅读 Linux 系统上的手册页,您将清楚地看到是做什么-r
的:
-r, --regexp-extended use extended regular expressions in the script.
检查sed
Unix 机器上的手册页并查看是否有等效选项(可能-E
)或转义 ERE 功能。
请参阅此处了解 BRE 和 ERE 之间的区别。
sed 's/^\(.\{2\}\)0\(.*\)$/\1\2/' <filename>
阅读手册以获取有关正则表达式的更多详细信息,或者只是谷歌。随机删除参数不太可能起作用(尽管“说出你尝试过的东西”的荣誉)。
并非所有的 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 间隔将默认工作。