簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM