我喜欢sed
但是我讨厌正则表达式中需要多少反斜杠。例如,这是一个sed
命令,它将从每行输入中取出前8个单词:
sed -n 's/^\(\S\+\s\+\)\{8\}\(.*\)/\2/p'
难看。
几乎每个角色都有一个反斜杠。如果sed
假设特殊字符在默认情况下是特殊字符,则会更好。
以下是我希望表达式的外观:
s/^(\S+\s){8}(.*)/\2/p
有没有办法实现这个目标?
答案 0 :(得分:2)
当然,但您需要启用-r
参数。
sed -rn 's/^(\S+\s){8}(.*)/\2/p'
来自sed --help
-r, - rengexp-extended
在脚本中使用扩展正则表达式。
答案 1 :(得分:2)
作为Avinash Raj has pointed out,sed
默认使用基本正则表达式(BRE)语法(需要(
,)
,{
,{{1 } {前面有}
来激活它的特殊含义),\
选项切换到扩展正则表达式(ERE)语法,它处理-r
,(
, )
,{
为特殊而不在}
之前。
除了这些转义序列:
\
POSIX standard明确地将行为未定义留给了ERE中的其他转义序列。
普通角色是与自身匹配的ERE。普通字符是受支持字符集中的任何字符,但ERE特殊字符中列出的ERE特殊字符除外。
表示对反斜杠(\^ \. \[ \$ \( \) \| \* \+ \? \{ \\
)前面的普通字符的解释。
由于行为未定义,实现可以自由地提供语法扩展。
正如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实现上运行,那么您当前的代码是可以接受的。