bash 问题中的 Grep

Ola*_*laf 1 grep bash regular-expression

示例字符串:

--000000000000f104a6057d4a0a10
Run Code Online (Sandbox Code Playgroud)

在这里我需要确定:“ --

相同的文件也包含很多相似的字符串;------=_, --=_, -----------,--<目前也会返回。因此,正则表达式必须适合。目前我也得到了它们:(

正则表达式我:^--\w+失败在grep的,Gedit的,蓝鱼... grep的预期效果如上,但作品:grep -r '^--\w+' file..并返回我没有结果,和grep -r '^--' file许多错误的。

另一个,类似但更复杂:示例字符串:

--b1_3445ee3d64c0259d451a115045580266
Run Code Online (Sandbox Code Playgroud)

识别这部分: --b1_....

Kus*_*nda 5

grep默认情况下,Standard不理解类似 Perl 的正则表达式 (PCRE),例如\w. 即使在基本和扩展的正则表达式中,GNUgrep也确实处理\w(和\W),这是标准行为的扩展。其他 PCRE 在 GNU 中grep使用其-P选项启用。

您的命令不返回任何内容的原因+是扩展的正则表达式运算符,它需要-E在 GNU 中工作grep

grep -E '^--\w+' file
Run Code Online (Sandbox Code Playgroud)

如果没有-E,您的表达式会尝试--W+逐字匹配(其中W某个单个字符与 匹配\w)。

另请注意,您可能还想在结尾处锚定表达式,如

grep -E '^--\w+$' file
Run Code Online (Sandbox Code Playgroud)

否则你以后会匹配包含非\w字符的行,比如

--00000000=
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用

grep -xE -e '--\w+' file
Run Code Online (Sandbox Code Playgroud)

它做同样的事情。该-x选项强制全行匹配。由于-e模式以破折号开头,因此需要从命令行选项中分隔表达式。

GNUgrep也理解\+基本的正则表达式(即使用grepwithout -Eor 时-P):

grep -x -e '--\w\+' file
Run Code Online (Sandbox Code Playgroud)

或者您可以使用\{1,\}代替\+.


对于非 GNU grepGNU grep),您可以使用[[:alnum:]_](匹配字母或数字,或此处单独包含的下划线)代替\w

grep -xE -e '--[[:alnum:]_]+' file
Run Code Online (Sandbox Code Playgroud)

要匹配十六进制数字和下划线,请使用[[:xdigit:]_]

grep -xE -e '--[[:xdigit:]_]+' file
Run Code Online (Sandbox Code Playgroud)

或者,

LC_ALL=C grep -xE -e '--[0-9a-fA-F_]+' file
Run Code Online (Sandbox Code Playgroud)

由于字符范围取决于区域设置,因此必须为命令设置LC_ALLto C(或 to POSIXgrep