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

时间:2015-10-29 19:57:10

标签: regex linux grep

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

list[1];
i[ab1];

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

3 个答案:

答案 0 :(得分:4)

[是正则表达式中的特殊字符,因为它用于表示范围(就像在子表达式[a-z||1-9]中使用它一样)。你需要转义它,以便grep将它解释为文字[字符;你可以用反斜杠作为前缀。

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

grep -i \\[[a-z\|\|1-9]\*\\] myfile

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

grep -i "\\[[a-z||1-9]*\\]" myfile

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

grep -i '\[[a-z||1-9]*\]' myfile

答案 1 :(得分:1)

$('.toggle-sidebar').click(function(event) { event.preventDefault(); var aside$ = $(this).parent().find('aside'); if ( aside$.hasClass('open') ) { aside$.removeClass('open'); } else { $('section aside').removeClass('open'); aside$.addClass('open'); } }); 不仅在grep中是特殊的,而且在shell中也是如此。你的转义只会影响shell,并且在传递给[]之前它们会被剥离。您可以使用引号添加另一层转义:

grep

另请注意,您的$ cat myfile list[1]; i[ab1]; othertext $ grep -i '\[[a-z||1-9]*\]' myfile list[1]; i[ab1]; 匹配文字管道。

答案 2 :(得分:1)

你没有逃脱。在grep看到它们之前,shell会解释并剥离反斜杠。

一个好的一般指导是始终将正则表达式放在单引号中。

grep -i '\[[a-z1-9]*\]' myfile

||似乎是一种误解,所以我把它拿出来了。在方括号之间,您只需输入匹配中允许的每个字符中的一个。

方括号在shell中具有相似的含义,这就是为什么第一个反斜杠只从shell中转义它们,而不是grepls [*]将找到一个名为字面的文件,其中包含一个星号,而不是所有文件或名称在方括号中的所有文件。 (在此处使用ls作为示例,但您通常不希望在脚本中使用ls;只有ls会列出所有文件;而echo [*]也会列出与通配符表达式匹配的所有文件 - 尽管在开箱即用的Bash中,如果没有匹配,则不会扩展通配符,因此错误消息可能会令人困惑地表明通配符不起作用。)< / p>

不引用参数可能非常危险,因为意外通配符扩展的结果将取决于当前目录中存在哪些文件。看哪:

vnix$ echo '|' >myfile

vnix$ grep -i \[[a-z||1-9]*\] myfile
grep: brackets ([ ]) not balanced
-bash: 1-9]*]: command not found

vnix$ grep -i \[[a-z\|\|1-9]*\] myfile

vnix$ # Right.  No matches.  But watch:

vnix$ touch '[|]'

vnix$ grep -i \[[a-z\|\|1-9]*\] myfile
|

vnix$ # !?! WTF?

vnix$ printf '<%s>\n' grep -i \[[a-z\|\|1-9]*\] myfile
<grep>
<-i>
<[|]>
<myfile>

所以 - 当有匹配的文件时,shell将未加引号的正则表达式扩展为通配符,并且你最终只是为了比你想象的更有其他东西。