我有以下字符串,我想替換(刪除)出現在字符串(SECONDWORD)中的第二個單詞。下面一行不會改變任何內容,只是輸出相同的字符串。但是,當我刪除字符串的'123'部分時,該行似乎工作。shell中的sed命令不會替換模式的第二個匹配
echo "WORD 123 SECONDWORD THIRDWORD" | sed 's/ *[A-Z]* *//2'
我沒有看到問題。
我有以下字符串,我想替換(刪除)出現在字符串(SECONDWORD)中的第二個單詞。下面一行不會改變任何內容,只是輸出相同的字符串。但是,當我刪除字符串的'123'部分時,該行似乎工作。shell中的sed命令不會替換模式的第二個匹配
echo "WORD 123 SECONDWORD THIRDWORD" | sed 's/ *[A-Z]* *//2'
我沒有看到問題。
試試這個: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
這可能爲你工作(GNU SED):
sed 's/\S\+\s*//2' file
刪除一個或多個非空格後跟零個或多個空格的第二次出現。
也可寫作:
sed 's/\S\S*\s*//2' file
參見:[堆棧溢出正則表達式常見問題解答(http://stackoverflow.com/a/22944075/3776858) – Cyrus