Shell
bash 正則表達式:星號使用 grep 給出不明確的搜尋結果
我正在使用一個簡單的文本文件
*
通過 grep 測試元字元。文本文件如下:1 11 111 1111 11111 111111 d da daa daaa b bc bcc bccc
現在,當我像這樣使用 grep 搜尋數字 1 時:
grep 1* regex.txt
輸出是
1 11 111 1111 11111 111111 d da daa daaa b bc bcc bccc
即使在字元“d”的情況下,結果與以紅色突出顯示的“d”相同,但在字元“a”和“b”的情況下,以下搜尋命令沒有輸出:
grep a* regex.txt grep b* regex.txt
並且下面的命令給出了預期的輸出
grep "a*" regex.txt grep "b*" regex.txt
為什麼這樣?為什麼
bash
偏向字元“d”而不是“a”和“b”
發生這種情況是因為
a*
andb*
沒有被引用,因此在傳遞給grep
. 例如,考慮這個目錄:$ ls afile.txt bfile.txt regex.txt
如果我嘗試執行
grep a* regex.txt
,a*
就會變成afile.txt
,這就是將作為搜尋模式給出的內容grep
。我們可以使用 bash 的調試選項 (set -x
) 來展示:$ set -x $ grep a* regex.txt + grep --color afile.txt regex.txt
它起作用
d
而不適用於a
或的原因b
是您有一個文件或目錄,其名稱以您目前目錄開頭a
並b
位於您的目前目錄中。如果你不這樣做,它會起作用:$ ls afile.txt bfile.txt regex.txt $ grep a* regex.txt ## no output, it's searching for 'afile.txt' $ rm afile.txt ## now there are no filenames starting with a $ grep a* regex.txt 1 11 111 1111 11111 111111 d da daa daaa b bc bcc bccc
為避免這種情況,請始終引用您的搜尋模式:
grep "a*" regex.txt
或者
grep 'a*' regex.txt