Grep

為什麼“grep -w”匹配後跟連字元/減號(“-”)的單詞?

  • October 6, 2021

我需要問你關於grep在 Debian 的 Bash 腳本中使用命令的問題。

例如,我有這些行的文件:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples
/vegetables-/carrot.txt
/vegetables-/garlic.txt

我想選擇 word 所在的所有行fruit-

我可以呼叫命令:

grep -w "fruit-" file.txt

輸出將是:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples

但是當我使用命令時:

grep -w "fruit" file.txt

我也得到與上面相同的輸出。但這是錯誤的。輸出應該是 0。因為我沒有輸入-模式。

為什麼不正確grep對待-

-w選項確實告訴grep只查找與fruit“單詞”匹配的行,這意味著它必須從行首開始或前面有“非單詞”字元,並且在行尾結束或後跟一個“非單詞”字元。

但是,根據手冊頁的“單詞”字元grep是:

構成單詞的字元是字母、數字和下劃線。

這意味著-是一個“非單詞”字元,並且fruit-將匹配“單詞搜尋”,fruit因為匹配算法將在到達-.

現在,您似乎只想選擇前兩行之間的內容/ 正好是 fruit的行,而不是包含 pattern fruit。在這些情況下,您必須使匹配更加明確:

  • 使用grep,您可以說:
grep "^/fruit/" file.txt

這會將模式錨定到行的開頭,並且只接受那些-fruit.

  • 或者,awk/集合用作欄位分隔符:
awk -F/ '!$1&&$2=="fruit"' file.txt

這將只接受第一個欄位為空(即以 a 開頭/)且第二個欄位恰好為 的行fruit

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