我正在尝试在文件中搜索包含“[]”括号的文本。例如,
list[1];
i[ab1];
Run Code Online (Sandbox Code Playgroud)
我试过了grep -i \[[a-z||1-9]*\] myfile。但它不起作用。这些方括号是特殊字符。我不知道如何逃避那里的特殊含义。任何人都可以提出任何建议吗?
[是正则表达式中的一个特殊字符,因为它用于表示一个范围(就像您在 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)
[]不仅在 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)
另请注意您的||匹配文字管道。