我有一个文件,其中包含以 2 颗星 (**) 开头的独特行。
但是,当我运行 grep 命令时
grep \*\* fileName
我得到了文件中的所有行。这是非常不寻常的,我所看到的不匹配行不包含 **。
我如何转义 ** 以找到正确的行?
答案1
您还可以通过指示grep
要匹配的字符串是固定字符串来实现相同的目的。执行此操作的开关是-F
或--fixed-strings
。
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
所以像这样的事情就可以做到:
$ grep -F "**" somefile.txt
例子
$ cat somefile.txt
** blah
blahblah
** hi
对文件进行 Grep 操作会产生以下结果:
$ grep -F "**" somefile.txt
** blah
** hi
答案2
所以尝试:
egrep "^\*\*" YOUR_FILE
不要忘记使用双引号。
笔记:使用egrep
而不是grep
.
如果你想使用grep
使用grep -E
答案3
在:
grep \*\* fileName
反斜杠用于*
在 shell 中转义(其中*
是通配符)。
grep
作为第二个参数接收的是一个由两个字符组成的字符串:**
。
作为正则表达式,这意味着任意(0 个或更多)数量的星号字符,所以基本上它匹配任何地方,因为它也匹配空字符串,这解释了为什么你得到文件的所有行。
因为正则表达式*
很特殊grep
还有,你也需要在那里逃脱它。最好是使用单引号而不是反斜杠转义*
到 shell(因为单引号是强 shell 引号,可以转义除单引号字符本身之外的每个字符),并使用反斜杠转义*
到 grep。在这种情况下,双引号也可以工作,但请注意,反斜杠对于双引号内的 shell 来说仍然是特殊的。
所以:
grep '\*\*' somefile.txt
(通过*
转义,它们不再是正则表达式运算符,而是被视为文字字符)将返回somefile.txt
包含 2 个星号字符序列的行。如果您希望仅在行的开头找到它们,则必须使用锚定正则表达式运算符^
:
grep '^\*\*' somefile.txt
不被视为正则表达式运算符的另一种方法*
是使用字符范围:
grep '^[*][*]' somefile.txt
另一种指定方式二星号字符是这样写的:
grep '^\*\{2\}' somefile.txt
(其中是另一个正则表达式运算符)如果您在将选项\{
传递给时使用扩展正则表达式,则更容易阅读(避免,因为它不是标准的):-E
grep
egrep
grep -E '^\*{2}' somefile.txt
(在扩展正则表达式中,{
是正则表达式运算符)。