2017-08-11 170 views
2
echo "xxabc jkl" | grep -onP '\w+(?!abc\b)' 
1:xxabc 
1:jkl 

爲什麼結果不如下?匹配所有不以指定字符串結尾的字符

echo "xxabc jkl" | grep -onP '\w+(?!abc\b)' 
1:jkl 

第一個字符串是xxabc,以abc結尾。
我想提取所有不以abc結尾的字符,爲什麼xxabc匹配?
如何修復它,也就是說只得到1:jkl作爲輸出?
爲什麼'\ w +(?! abc \ b)'無法工作?

回答

1

\w+(?!abc\b) pattern matches xxabc因爲\w+貪婪地匹配一個或多個字符,因此一次抓取xxabc。然後,負向預測(?!abc\b)確保沒有abc,其立即在當前位置的左側具有尾隨字邊界。由於在xxabc之後沒有abc與尾隨字邊界,匹配成功

,以匹配不abc使用PCRE正則表達式結尾的話,你可以使用

echo "xxabc jkl" | grep -onP '\b\w+\b(?<!abc)' 

online demo

詳細

  • \b - 領先的詞邊界
  • \w+ - 1或多個單詞字符
  • \b - 尾隨字邊界
  • (?<!abc) - 如果3個字母立即到當前位置的左邊是abc失敗比賽負回顧後發。
1

沒有pcregrep特殊功能,你可以做到這一點增加了管道的sed:

echo "xxabc jkl" | sed 's/[a-zA-Z]*abc//g' | grep -onE '[a-zA-Z]+' 

或使用awk:

echo "xxabc jkl" | awk -F'[^a-zA-Z]+' '{for(i=1;i<=NF;i++){ if ($i!~/abc$/) printf "%s: %s\n",NR,$i }}' 

另一種方法:

echo "xxabc jkl" | awk -F'([^a-zA-Z]|[a-zA-Z]*abc\\>)+' '{OFS="\n"NR": ";if ($1) printf OFS;$1=$1}1' 
相關問題