示例字符串:
--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
还可以理解\+
基本正则表达式(即使用grep
without-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\+'