Sed表达式不允许使用可选的分组字符串

时间:2011-05-27 18:26:17

标签: regex sed

我正在尝试在sed脚本中使用以下正则表达式,但它不起作用:

sed -n '/\(www\.\)\?teste/p'

上面的正则表达式似乎不起作用。 sed似乎不会将?应用于分组www\.

如果您使用切换-E的{​​{1}}参数来使用扩展正则表达式,则它会起作用,因此语法变为:

sed

这很好但我想在不支持sed -En '/(www\.)?teste/p' 运算符的机器上运行此脚本。我很确定这是可能的,而且我做的事非常愚蠢。

1 个答案:

答案 0 :(得分:89)

标准sed只能理解POSIX Basic Regular Expressions(BRE),而不是扩展正则表达式(ERE),?是ERE中的元字符,但不是BRE中的元字符。

如果您打开它们,您的sed版本可能会支持ERE。使用GNU sed,相关选项为-r--regexp-extended,描述为“在脚本中使用扩展正则表达式”。

但是,如果你的sed不支持它 - 相当合理 - 那么你就会陷入困境。导入支持它们的sed版本,或重新设计您的处理。也许您应该使用awk代替。


2014年2月21日

我不知道为什么我没有提到即使sed不支持简写?\?表示法,但它确实支持{{1}的计数范围},因此您可以使用\{n,m\}模拟?

\{0,1\}

产生:

sed -n '/\(www\.\)\{0,1\}teste/p' << EOF
http://www.tested.com/
http://tested.com/
http://www.teased.com/
EOF

使用标准BSD http://www.tested.com/ http://tested.com/ 和GNU sed 4.2.2在Mac OS X 10.9.1 Mavericks上测试。