2011-09-22 49 views

回答

40
[^x] 

這是可以接受任何字符以外x字符類。

+11

我將添加來自掌握正則表達式的警告。請注意,爲了匹配,那裏一定有東西。正則表達式'su [^ x]'將匹配'sum'和'sun',但不匹配'su'。 – johnny

+1

你如何解決它匹配你提到'蘇'的情況? – jcalfee314

+0

@ jcalfee314,我相信它應該可以添加一個?像'su [^ x]?'這意味着它應該匹配零個或其中一個字符。 – GradysGhost

1

從我自己的經驗,下面的帖子支持這個,sed不支持使用「^」的正則正則表達式否定。我不認爲sed有直接的否定方法......但是如果你檢查下面的文章,你會看到一些解決方法。 Sed regex and substring negation

+0

這個作品的排序:echo'blahyeah'| sed's @ href =「[^ http] @href =」/ @ g' –

+0

輸出:blahyeah(只匹配相對url) –

+0

這是不正確的。 'sed'支持'[^ ...]'否定就好了。不過,也許你對這個構造的理解是不完整的?但是,鏈接的問題很有用。 – tripleee

4

對於那些不滿意所選答案johnny's comment

'su [^ x]'將匹配'sum'和'sun',但不匹配'su'。

您可以使用下面的語法告訴sed來not匹配線,x

sed '/x/! s/su//' file 

See kkeller's answer for another example.

+1

即使它應該匹配,這也會跳過'x su'。你可以執行'/ sux /!s/su //',但是它仍然會跳過'su sux',也許第一個,而不是第二個'su'應該匹配。理想情況下,OP應澄清要求。 – tripleee

3

有你的問題的兩種可能的解釋。像其他人已經指出的那樣,[^x]匹配不是x的單個字符。但空字符串也不是x,所以也許你正在尋找[^x]\|^$

這些答案都不會延伸到多字符序列,這通常是人們正在尋找的。你可以精心打造類似

[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\) 

組成一個正則表達式不匹配str,但在sed一個更簡單的解決辦法是要刪除的確實比賽str任意行,然後繼續休息;

sed '/str/d' file 

的Perl 5引入了更豐富的正則表達式引擎,這是Java,PHP,Python等於是標準由於Perl有益支持sed語法的一個子集,你很可能轉換一個簡單的sed腳本Perl來得到一個有用的功能,從這個擴展的正則表達式的方言,如負斷言:

perl -pe 's/(?:(?!str).)+/not/' file 

將替換字符串這是不strnot(?:...)是一個非捕獲組(與許多sed方言不同,非轉義括號是Perl中的元字符),並且(?!str)是否定斷言;緊接在字符串中此位置之後的文本不得爲str以便正則表達式匹配。 +重複此模式,直到它無法匹配。注意比賽中每個位置的斷言必須是真實的,所以我們一次匹配一個字符與.(新手們經常得到這個錯誤,並且錯誤地僅在例如較長模式的開始處斷言,然而其可以匹配str在某處,導致「泄漏」)。

相關問題