还有另一种常规表达"味道"在GNU sed?

时间:2015-02-09 01:24:39

标签: regex bash sed

我喜欢sed但是我讨厌正则表达式中需要多少反斜杠。例如,这是一个sed命令,它将从每行输入中取出前8个单词:

sed -n 's/^\(\S\+\s\+\)\{8\}\(.*\)/\2/p'

难看。

几乎每个角色都有一个反斜杠。如果sed假设特殊字符在默认情况下是特殊字符,则会更好。

以下是我希望表达式的外观:

s/^(\S+\s){8}(.*)/\2/p

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

当然,但您需要启用-r参数。

sed -rn 's/^(\S+\s){8}(.*)/\2/p'

来自sed --help

  

-r, - rengexp-extended

     

在脚本中使用扩展正则表达式。

答案 1 :(得分:2)

在sed中切换到ERE

作为Avinash Raj has pointed outsed默认使用基本正则表达式(BRE)语法(需要(){,{{1 } {前面有}来激活它的特殊含义),\选项切换到扩展正则表达式(ERE)语法,它处理-r(){为特殊而不在}之前。

POSIX标准

除了这些转义序列:

\

POSIX standard明确地将行为未定义留给了ERE中的其他转义序列。

  

普通角色是与自身匹配的ERE。普通字符是受支持字符集中的任何字符,但ERE特殊字符中列出的ERE特殊字符除外。

表示对反斜杠(\^ \. \[ \$ \( \) \| \* \+ \? \{ \\ )前面的普通字符的解释。

由于行为未定义,实现可以自由地提供语法扩展。

转义序列的GNU扩展

正如rici在评论中指出的那样,'\'\s是GNU扩展。 GNU实现还为正则表达式和替换字符串语法提供the following extensions(对于BRE和ERE):

\S

以及仅在正则表达式中使用的以下扩展名:

\a \f \n \r \t \v
\cX
\dXXX
\oXXX
\xXX

此外,这些未记录/未充分记录的扩展程序:

\w \W
\b \B
\'
\`

如果代码永远不会在sed的非GNU实现上运行,那么您当前的代码是可以接受的。