2017-08-11 127 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' 
相关问题