[英]Need RegExp help for Linux Bash grep command to filter out lines containing square brackets
[英]how to use grep to search for text containing square brackets(“[ ]”) in Linux
我正在嘗試搜索文件以查找包含“[]”括號的文本。 例如,
list[1];
i[ab1];
我試過grep -i \\[[az||1-9]*\\] myfile
。 但它不起作用。 這些方括號是特殊字符。 我不知道如何逃避那里的特殊含義。 任何人都可以提出任何建議嗎?
[
是正則表達式中的特殊字符,因為它用於表示范圍(就像在子表達式[az||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
[]
特別不僅在grep中,而且在shell中。 你的轉義只會影響shell,並且在傳遞給grep
之前它們會被剝離。 您可以使用引號添加另一層轉義:
$ cat myfile
list[1];
i[ab1];
othertext
$ grep -i '\[[a-z||1-9]*\]' myfile
list[1];
i[ab1];
還要注意你的||
匹配文字管道。
你沒有逃脫。 在grep
看到它們之前,shell會解釋並剝離反斜杠。
一個很好的一般指導是始終將正則表達式放在單引號中。
grep -i '\[[a-z1-9]*\]' myfile
||
似乎是一種誤解所以我把它拿出來了。 在方括號之間,您只需放置匹配中允許的每個字符中的一個。
方括號在shell中具有相似的含義,這就是為什么第一個反斜杠只將它們從shell中轉移出來,而不是從grep
。 ls [*]
將找到一個名為字面的文件,其中包含一個星號,而不是所有文件或名稱在方括號中的所有文件。 (在這里使用ls
作為一個例子,你通常不想在腳本中使用ls
;而且只是ls
會列出所有文件;而echo [*]
也會列出與通配符表達式匹配的所有文件 - 盡管在Bash中如果沒有匹配,則不會擴展通配符,因此錯誤消息可能會令人困惑地建議通配符不起作用。)
不引用參數可能非常危險,因為意外通配符擴展的結果將取決於當前目錄中存在哪些文件。 看吧:
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將未加引號的正則表達式擴展為通配符,並且你最后還要比其他人想象的更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.