我正在尝试搜索文件以查找包含“[]”括号的文本。例如,
list[1];
i[ab1];
我试过了grep -i \[[a-z||1-9]*\] myfile
。但它不起作用。这些方括号是特殊字符。我不知道如何逃避那里的特殊含义。任何人都可以提出任何建议吗?
答案 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中转义它们,而不是grep
。 ls [*]
将找到一个名为字面的文件,其中包含一个星号,而不是所有文件或名称在方括号中的所有文件。 (在此处使用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将未加引号的正则表达式扩展为通配符,并且你最终只是为了比你想象的更有其他东西。