Grep
為什麼“grep -w”匹配後跟連字元/減號(“-”)的單詞?
我需要問你關於
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
的行,而不是包含 patternfruit
。在這些情況下,您必須使匹配更加明確:
- 使用
grep
,您可以說:grep "^/fruit/" file.txt
這會將模式錨定到行的開頭,並且只接受那些
-
在fruit
.
- 或者,
awk
將/
集合用作欄位分隔符:awk -F/ '!$1&&$2=="fruit"' file.txt
這將只接受第一個欄位為空(即以 a 開頭
/
)且第二個欄位恰好為 的行fruit
。