bash 问题中的 Grep

bash 问题中的 Grep

示例字符串:

--000000000000f104a6057d4a0a10

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

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

正则表达式我有:^--\w+在 grep 中失败,预期结果如上所述,但在 Gedit、Bluefish... grep: grep -r '^--\w+' file.. 中有效,并且没有返回任何结果,并且grep -r '^--' file出现许多错误。

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

--b1_3445ee3d64c0259d451a115045580266

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

答案1

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

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

grep -E '^--\w+' file

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

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

grep -E '^--\w+$' file

否则您\w稍后将匹配包含非字符的行,例如

--00000000=

或者,您可以使用

grep -xE -e '--\w+' file

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

GNUgrep还可以理解\+基本正则表达式(即使用grepwithout-E或时-P):

grep -x -e '--\w\+' file

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


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

grep -xE -e '--[[:alnum:]_]+' file

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

grep -xE -e '--[[:xdigit:]_]+' file

或者,

LC_ALL=C grep -xE -e '--[0-9a-fA-F_]+' file

LC_ALL命令的to C(或 to POSIX)设置grep是必要的,因为字符范围取决于区域设置。

答案2

  • 使用扩展正则表达式
grep -E '^--\w+'
egrep '^--\w+'
  • 或转义重复运算符
grep '^--\w\+'

相关内容