題 正則表達式:不以“模式”開頭


我的LIST文件中有很多行,並且只想列出名稱不以(或包含)“git”開頭的行。

到目前為止我有:

cat LIST | grep ^[^g]

但我想要像:

#not starting by "git"
cat LIST | grep ^[^(git)]
#not containing "git"
cat LIST | grep .*[^(git)].*

但這不正確。我應該使用什麼樣的正則表達式?


4
2017-10-07 23:04


起源




答案:


運用 grep 在這種情況下 -P 選項,將PATTERN解釋為Perl正則表達式

grep -P '^(?:(?!git).)*$' LIST

正則表達式解釋:

^             the beginning of the string
 (?:          group, but do not capture (0 or more times)
   (?!        look ahead to see if there is not:
     git      'git'
   )          end of look-ahead
   .          any character except \n
 )*           end of grouping
$             before an optional \n, and the end of the string

使用 find 命令

find . \! -iname "git*"

14
2017-10-13 09:41



不確定表達式如何在內部進行優化,但我不會使用量詞 + 在外部群體。考慮到它不會捕獲它的匹配,我只需將它全部刪除,以獲得更簡單/可讀的表達式。 - Mario
此表達式將匹配從無法開頭的行的開頭到結尾的任何內容 git - hwnd
你的第一個命令是我正在尋找的:)但是我不明白(?!git)的作用是什麼? - Vulpo
這是一個負面的預測斷言,請參閱更新的編輯。 - hwnd


由於OP正在尋找一般的正則表達式而不是專門用於grep,因此這是不以“git”開頭的行的一般正則表達式。

^(?!git).*

分解:

^ 行的開頭

(?!git) 沒有跟著'git'

.* 後跟0個或更多字符


3
2018-01-28 23:01





如果你想簡單地列出所有不包含git的行,試試這個

 cat LIST | grep -v git

2
2017-10-07 23:08



在這種特定情況下,它確實有效。謝謝。但我更喜歡使用正則表達式,因為它可以在更多情況下使用(例如,解析用戶輸入的perl腳本)。 - Vulpo
也許 這個帖子 在SO上有你需要的東西。 - dinesh
幾乎。我嘗試匹配不包含字符串的內容。如果可能的話,不使用grep中的“-v”選項:) - Vulpo