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

なぜ結果は次のようにはなりませんか?指定された文字列で終わらないすべての文字を一致させるには

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

最初の文字列はabcで終わるxxabcです。
abcで終わっていないすべての文字を抽出したいのですが、なぜxxabcが一致しますか?
修正する方法、つまり1:jklを出力するだけですか?
なぜ '\ w +(?! abc \ b)'が機能しないのですか?

答えて

1

\w+(?!abc\b) pattern matches xxabc\w+は、1つ以上の単語の文字に貪欲に一致しているため、一度にxxabcを取得します。次に、負の先読み(?!abc\b)は、abcが存在しないことを確認し、末尾の単語境界が現在の位置のすぐ左にあるようにします。 xxabcの後には、末尾の単語境界を持つabcが存在しないため、は、の後に続きます。先頭ワード -

PCRE正規表現を使用してabcで終了していないすべての単語を一致させるには、あなたはonline demo

詳細

  • \bを参照してください

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

    を使用することができます境界

  • \w+から1以上の単語文字
  • \b - 末尾の単語境界
  • (?<!abc) - 直ちに現在位置の左に3つの文字場合マッチに失敗した負の後読みabcあります。 pcregrep特別な機能なし
1

、あなたは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' 
関連する問題