Shell

bash 正則表達式:星號使用 grep 給出不明確的搜尋結果

  • November 14, 2015

我正在使用一個簡單的文本文件*通過 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.txta*就會變成afile.txt,這就是將作為搜尋模式給出的內容grep。我們可以使用 bash 的調試選項 ( set -x) 來展示:

$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt

它起作用d而不適用於a或的原因b是您有一個文件或目錄,其名稱以您目前目錄開頭ab位於您的目前目錄中。如果你不這樣做,它會起作用:

$ 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

引用自:https://unix.stackexchange.com/questions/242983