2017-06-19 478 views
1

我有以下字符串,我想替換(刪除)出現在字符串(SECONDWORD)中的第二個單詞。下面一行不會改變任何內容,只是輸出相同的字符串。但是,當我刪除字符串的'123'部分時,該行似乎工作。shell中的sed命令不會替換模式的第二個匹配

echo "WORD 123 SECONDWORD THIRDWORD" | sed 's/ *[A-Z]* *//2' 

我沒有看到問題。

+0

參見:[堆棧溢出正則表達式常見問題解答(http://stackoverflow.com/a/22944075/3776858) – Cyrus

回答

0

試試這個:sed -r 's/\b[A-Z]+ *//2

*,它匹配零個OCCURENCES,是問題。

你可以通過播放尾隨號碼來看到這一點。當空間分隔的字符串與[A-Z]不匹配時,您將得到匹配不匹配字符串的空字符串匹配項。

 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//1' 
    123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//2' 
    WORD 123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//3' 
    WORD 123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//4' 
    WORD 123THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//5' 
    WORD 123 SECONDWORD FOURTHWORD 

...所以,當你有123在那裏你實際上想要刪除第4個匹配的項目。其中'WORD ', null, null,' SECONDWORD ','THIRDWORD '匹配模式1-5。它在123的邊界上匹配兩個空字符串。

您可以通過使用+而不是*sed -r解決這個問題:

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed -r 's/ *[A-Z]+ *//2' 
WORD 123THIRDWORD FOURTHWORD 

或者用醜陋\{1,\}語法,而不-r

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]\{1,\} *//2' 
WORD 123THIRDWORD FOURTHWORD 

吃你沒」的空間不想吃東西,所以用了\b字界標記:

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed -r 's/\b[A-Z]+ *//2' 
WORD 123 THIRDWORD FOURTHWORD 
-1

這可能爲你工作(GNU SED):

sed 's/\S\+\s*//2' file 

刪除一個或多個非空格後跟零個或多個空格的第二次出現。

也可寫作:

sed 's/\S\S*\s*//2' file