Linux

Bash 中的正則表達式問題:n例如_一個__n和G一種噸和^negate似乎不起作用

  • December 5, 2019

當我ls /directory | grep '[^term]'在 Bash 中執行時,我會得到一個正常列表,就好像該grep命令以某種方式被忽略了一樣。我嘗試了同樣的事情egrep,我嘗試將它與雙引號和單引號一起使用,但沒有更好的結果。當我嘗試時,ls /directory | grep '^[term]我得到所有以 term 開頭的條目 - 正如預期的那樣。

我已經在線上編輯器中嘗試了這個命令,在那裡我可以測試我的正則表達式,它應該可以正常工作。但不是在 Bash 中。所以它在模擬中有效,但在現實生活中無效。

我在 Crunchbang Linux 10 上工作。我希望這是足夠的資訊,並期待每一個提示,因為未能在如此基本的級別上執行並浪費數小時的時間真的令人沮喪!

你確定你想要的事情正在發生嗎?當您執行時,ls /directory | grep '[^term]'您實際上是在尋找字母而不是 m。這意味著如果一個文件的名稱中有其他字母,它仍然會出現在ls. 以以下目錄為例:

$ ls
alpha  brave  bravo  charlie  delta

現在,如果我執行,ls |grep '^[brav]'我會得到以下資訊:

$ ls |grep '^[brav]'
alpha
brave
bravo

正如你所看到的,我不僅得到了brave,而且bravo我也得到了alpha,因為字元類[]將從該列表中獲取任何字母。

因此,如果我執行,我將得到名稱中任何位置ls |grep '[^brav]'不包含字元 brav 的所有文件。

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

如果您注意到它包含整個目錄列表,因為所有文件都至少有一個字母未包含在字元類中。

因此,正如 Kanvuanza 所說,用 grep 查找“術語”的倒數,而不是t e r m您應該使用的字元grep -v

例如:

$ ls |grep -v 'brav'
alpha
charlie
delta

此外,如果您不希望類中包含任何字元的文件,請使用grep -v '[term]'. 這將阻止任何具有這些字元的文件出現。(坎萬扎的回答)

例如:

$ ls |grep -v '[brav]'

如您所見,沒有列出任何文件,因為此目錄中的所有文件都至少包含該類的一個字母。

附錄:

我想補充一點,使用 PCRE 可以只使用正則表達式來過濾掉使用否定表達式。為此,您將使用稱為負前瞻正則表達式的東西:(?!<regex>).

因此,使用上面的範例,您可以執行類似的操作來獲得您想要的結果,而無需使用grep標誌。

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

要解構該正則表達式,它首先在行首匹配^,然後查找不匹配的字元串brav以跟隨。Only alpha, charlie, and deltamatch 所以這些是唯一被列印的。

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