如何在 Linux 中使用 grep 搜索包含方括号(“[ ]”)的文本

Jer*_*rry 5 regex linux grep

我正在尝试在文件中搜索包含“[]”括号的文本。例如,

list[1];
i[ab1];
Run Code Online (Sandbox Code Playgroud)

我试过了grep -i \[[a-z||1-9]*\] myfile。但它不起作用。这些方括号是特殊字符。我不知道如何逃避那里的特殊含义。任何人都可以提出任何建议吗?

dav*_*mac 5

[是正则表达式中的一个特殊字符,因为它用于表示一个范围(就像您在 subexpression 中使用它一样[a-z||1-9])。您需要对其进行转义,以便 grep 将其解释为文字[字符;你可以通过在它前面加上反斜杠来做到这一点。

但是,反斜杠也是 shell 中的转义字符。要将单个反斜杠传递给 grep,您需要在 shell 命令行中将其加倍!您还需要对|字符进行转义,并且确实应该对*字符进行转义,因为这些对 shell 来说也是特殊的:

grep -i \\[[a-z\|\|1-9]\*\\] myfile
Run Code Online (Sandbox Code Playgroud)

如果你只是用双引号将整个字符串括起来,它会变得更容易一些:

grep -i "\\[[a-z||1-9]*\\]" myfile
Run Code Online (Sandbox Code Playgroud)

请注意,您仍然需要将反斜杠加倍,因为它们也可以转义带引号的字符串中的字符。更好的是使用一个用引号括起来的字符串,其中反斜杠不作为转义符:

grep -i '\[[a-z||1-9]*\]' myfile
Run Code Online (Sandbox Code Playgroud)


tha*_*guy 0

[]不仅在 grep 中很特殊,在 shell 中也很特殊。你的转义只会影响 shell,它们在传递到 之前会被剥离grep。您可以使用引号添加另一层转义:

$ cat myfile
list[1];
i[ab1];
othertext

$ grep -i '\[[a-z||1-9]*\]' myfile
list[1];
i[ab1];
Run Code Online (Sandbox Code Playgroud)

另请注意您的||匹配文字管道。