gpt4 book ai didi

regex - GNU sed 中是否还有另一个正则表达式 "flavor"?

转载 作者:行者123 更新时间:2023-11-29 09:38:06 25 4
gpt4 key购买 nike

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

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

丑陋。

几乎每个字符前面都有一个反斜杠。如果 sed 假设特殊字符在默认情况下是特殊的,那就更好了。

下面是我希望表达式的样子:

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

有什么办法可以实现吗?

最佳答案

在 sed 中切换到 ERE

作为Avinash Raj has pointed out , sed 默认使用基本正则表达式 (BRE) 语法, (这需要 (, ), {, } 前面有 \ 以激活其特殊含义),-r 选项切换到扩展正则表达式 (ERE) 语法,这将 (, ), {, } 视为特殊的,无需在 \ 前面。

POSIX 标准

除了这些转义序列:

\^    \.    \[    \$    \(    \)    \|
\* \+ \? \{ \\

POSIX standard为 ERE 中的其他转义序列显式保留行为未定义

An ordinary character is an ERE that matches itself. An ordinary character is any character in the supported character set, except for the ERE special characters listed in ERE Special Characters. The interpretation of an ordinary character preceded by a backslash ( '\' ) is undefined.

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

转义序列的 GNU 扩展

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

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

以及以下仅用于正则表达式的扩展:

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

加上这些未记录/记录不足的扩展:

\s \S
\< \>

如果代码从未在 sed 的非 GNU 实现上运行,则您当前的代码是可以接受的。

关于regex - GNU sed 中是否还有另一个正则表达式 "flavor"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com