ber*_*ers 28 grep sed regular-expression
我在 Windows 上,但我想我的问题仍然正确地放在这里。
C:\Users\User>grep --version
GNU grep 2.6.3
C:\Users\User>sed --version
GNU sed version 4.2.1
Run Code Online (Sandbox Code Playgroud)
我注意到以下工作(输出here
):
echo here | grep -E "\w+"
echo here | grep -E "[her]+"
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用(不输出任何内容):
echo here | grep -E "[\w]+"
Run Code Online (Sandbox Code Playgroud)
这再次执行(输出here
):
echo here | grep -P "[\w]+"
Run Code Online (Sandbox Code Playgroud)
[\w]
我认为这是 Perl 正则表达式特有的东西。那是对的吗?
所以,让我们谈谈sed
。这有效(输出gone
):
echo here | sed -r "s/\w+/gone/"
echo here | sed -r "s/[her]+/gone/"
Run Code Online (Sandbox Code Playgroud)
同样,这不会(输出here
):
echo here | sed -r "s/[\w]+/gone/"
Run Code Online (Sandbox Code Playgroud)
现在,我如何为 sed 激活 Perl 正则表达式——有什么办法吗?
Sté*_*las 15
不同的工具及其版本支持不同的正则表达式变体。每个文档都会告诉您它们支持什么。
存在标准以便人们可以依赖所有符合要求的应用程序中可用的最小功能集。
例如,所有现代实现sed
和grep
实现了 POSIX 指定的基本正则表达式(至少是标准的一个版本或另一个版本,但该标准在过去几十年中在这方面没有太大的发展)。
在 POSIX BRE 和 ERE 中,您有[:alnum:]
字符类。这与您的语言环境中的字母和数字匹配(请注意,a-zA-Z0-9
除非语言环境为 C,否则通常包含的内容要多得多)。
所以:
grep -x '[[:alnum:]_]\{1,\}'
Run Code Online (Sandbox Code Playgroud)
匹配一个或多个 alnums 或 _。
[\w]
POSIX 要求匹配反斜杠或w
. 因此,您将找不到可用的grep
或sed
实现(除非通过非标准选项)。
\w
POSIX 没有指定for 的行为,因此允许实现做他们想做的事。GNUgrep
很久以前就补充过了。
GNUgrep
曾经有自己的正则表达式引擎,但现在使用 GNU libc 的引擎(尽管它确实嵌入了自己的副本)。
它的目的是在您的语言环境中匹配 alnums 和下划线。但是,它目前有一个错误,即它只匹配单字节字符(例如,在 UTF-8 语言环境中不匹配 é,即使这显然是一个字母,即使它在 é 是单个的所有语言环境中匹配 é特点)。
\w
perl regexp 和 PCRE 中也有一个regexp 运算符。PCRE/perl 不是 POSIX 正则表达式,它们完全是另一回事。
现在,根据 GNUgrep -P
使用 PCRE的方式,它遇到了与不使用-P
. 它可以通过使用来解决(*UCP)
(尽管这在非 UTF8 语言环境中也有副作用)。
GNUsed
也使用 GNU libc 的正则表达式作为它自己的正则表达式。它以这样的方式使用它,尽管它没有与 GNU 相同的错误grep
。
GNUsed
不支持 PCRE。代码中有一些证据表明之前已经尝试过,但似乎不再提上日程了。
如果你想要 Perl 的正则表达式,perl
尽管使用。
否则,我会说与其试图依赖sed
/的特定实现的虚假非标准功能,grep
不如坚持标准并使用[_[:alnum:]]
.
你是对的 -\w
是 PCRE 的一部分 - perl 兼容的正则表达式。不过,它不是“标准”正则表达式的一部分。http://www.regular-expressions.info/posix.html
的某些版本sed
可能支持它,但我建议最简单的方法是通过指定标志perl
在sed
模式下使用-p
。(连同-e
)。(更多细节在perlrun
)
但是[]
在那个例子中你不需要围绕它 - 那是用于一组有效的东西。
echo here | perl -pe 's/\w+/gone/'
Run Code Online (Sandbox Code Playgroud)
或者在 Windows 上:
C:\>echo here | perl -pe "s/\w+/gone/"
gone
C:\>echo here | perl -pe "s/[\w\/]+/gone/"
gone
Run Code Online (Sandbox Code Playgroud)
查看perlre
更多 PCRE 内容。
你可以在这里获得 perl:http : //www.activestate.com/activeperl/downloads