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

Edu*_*rdo 52 regex sed

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

sed -n '/\(www\.\)\?teste/p'
Run Code Online (Sandbox Code Playgroud)

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

如果您使用-E切换sed到使用扩展正则表达式的参数,它可以工作,因此语法变为:

sed -En '/(www\.)?teste/p'
Run Code Online (Sandbox Code Playgroud)

这工作正常但我想在不支持-E运算符的机器上运行此脚本.我很确定这是可能的,我正在做一些非常愚蠢的事情.

Jon*_*ler 97

标准sed只能理解POSIX 基本正则表达式(BRE),而不是扩展正则表达式(ERE),它?是ERE中的元字符,但不是BRE中的元字符.

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

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


2014年2月21日

我不知道为什么我没有提到的是,即使sed不支持简写?\?符号,它不支持计数范围有\{n,m\},所以你可以模拟?使用\{0,1\}:

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

产生:

http://www.tested.com/
http://tested.com/
Run Code Online (Sandbox Code Playgroud)

使用标准BSD sed和GNU sed4.2.2 在Mac OS X 10.9.1 Mavericks上测试.

  • sed在BSD(选项`-E`)和Linux / Cygwin上通过(`-r`)支持ERE。在某些较旧的Unix系统上,虽然没有ERE,但您仍然无法使用BRE (2认同)