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_....
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
也理解\+
基本的正则表达式(即使用grep
without -E
or 时-P
):
grep -x -e '--\w\+' file
Run Code Online (Sandbox Code Playgroud)
或者您可以使用\{1,\}
代替\+
.
对于非 GNU grep
(和GNU 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_ALL
to C
(或 to POSIX
)grep
。