我正在尝试在sed
脚本中使用以下正则表达式,但它不起作用:
sed -n '/\(www\.\)\?teste/p'
上面的正则表达式似乎不起作用。 sed
似乎不会将?
应用于分组www\.
。
如果您使用切换-E
的{{1}}参数来使用扩展正则表达式,则它会起作用,因此语法变为:
sed
这很好但我想在不支持sed -En '/(www\.)?teste/p'
运算符的机器上运行此脚本。我很确定这是可能的,而且我做的事非常愚蠢。
答案 0 :(得分:89)
标准sed
只能理解POSIX Basic Regular Expressions(BRE),而不是扩展正则表达式(ERE),?
是ERE中的元字符,但不是BRE中的元字符。
如果您打开它们,您的sed
版本可能会支持ERE。使用GNU sed
,相关选项为-r
和--regexp-extended
,描述为“在脚本中使用扩展正则表达式”。
但是,如果你的sed
不支持它 - 相当合理 - 那么你就会陷入困境。导入支持它们的sed
版本,或重新设计您的处理。也许您应该使用awk
代替。
我不知道为什么我没有提到即使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上测试。