使用正则表达式和 Grep 转义 *

使用正则表达式和 Grep 转义 *

我有一个文件,其中包含以 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

(其中是另一个正则表达式运算符)如果您在将选项\{传递给时使用扩展正则表达式,则更容易阅读(避免,因为它不是标准的):-Egrepegrep

grep -E '^\*{2}' somefile.txt

(在扩展正则表达式中,{是正则表达式运算符)。

相关内容