我喜欢sed但我讨厌它的正则表达式需要多少个反斜杠。例如,以下sed命令将从每行输入中取出前 8 个单词:
sed -n 's/^\(\S\+\s\+\)\{8\}\(.*\)/\2/p'
Run Code Online (Sandbox Code Playgroud)
丑陋的。
几乎每个字符前面都有一个反斜杠。sed如果假设特殊字符默认是特殊的,那就更好了。
这是我希望表达式的外观:
s/^(\S+\s){8}(.*)/\2/p
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?
正如Avinash Raj 指出的那样,sed默认使用基本正则表达式 (BRE) 语法(需要在前面加上(, ), {,来激活其特殊含义),选项切换到扩展正则表达式 (ERE) 语法,该语法将, , ,作为特殊的,没有前面的。}\-r(){}\
除了这些转义序列之外:
\^ \. \[ \$ \( \) \|
\* \+ \? \{ \\
Run Code Online (Sandbox Code Playgroud)
POSIX标准明确地为 ERE 中的其他转义序列保留了未定义的行为。
普通字符是与自身匹配的 ERE。普通字符是受支持的字符集中的任何字符,除了 ERE 特殊字符中列出的 ERE 特殊字符。前面带有反斜杠 (
'\') 的普通字符的解释是未定义的。
由于行为未定义,因此实现可以自由地提供语法扩展。
正如rici在评论中指出的那样,\s和\S是 GNU 扩展。GNU 实现还为正则表达式和替换字符串语法(对于 BRE 和 ERE)提供以下扩展:
\a \f \n \r \t \v
\cX
\dXXX
\oXXX
\xXX
Run Code Online (Sandbox Code Playgroud)
以及以下仅在正则表达式中使用的扩展:
\w \W
\b \B
\'
\`
Run Code Online (Sandbox Code Playgroud)
加上这些未记录/记录不足的扩展:
\s \S
\< \>
Run Code Online (Sandbox Code Playgroud)
如果代码从未在 sed 的非 GNU 实现上运行,则您当前的代码是可以接受的。
当然可以,但是你需要启用-r参数。
sed -rn 's/^(\S+\s){8}(.*)/\2/p'
Run Code Online (Sandbox Code Playgroud)
从sed --help
-r, --regexp-扩展
在脚本中使用扩展正则表达式。