sed正規表現テキスト処理は、グループ化された参照シフトの混乱をキャプチャします。

sed正規表現テキスト処理は、グループ化された参照シフトの混乱をキャプチャします。

sedのキャプチャグループALTERNATIONが期待どおりに機能しません。

シフトの優先順位は最も低いですが、混乱することは次のとおりです。

echo "abcd_aefghi" | sed -r "s/(a)(b)(c)(d)|(a)(e)(f)(g)/\8/g;"

observed result --> _ghi
expected result --> error: invalid reference \8 RHS

a--bcd | # Logical alternation (Not bitwise!!)
#must be different separated logical state processing!! 
#not involvement of look behind registered reference grouping Counting!!
a--efg ;

返品

sed -r "s/(a)((b)(c)(d)|(e)(f)(g))/\8/;"
observed result --> _ghi

もっと混乱した場合

sed -r "s/(a)(b)(c)(d)()|((a)(e)(f)(g))/\8/g"

observed result --> _ehi

また、より混乱しています。

sed -r "s/(a)(b)(c)(d)()||||i am Not comment, Whats going here?|||||||((a)(e)(f)(g))/\8/g"

observed result --> _ehi
expected result --> full parsing error, because "||"

最悪なのは内部グループマッチングだ。

echo "aBcB_aCfC" | sed -r "s/(a)((B)(c)(\1)|(C)(f)(\1))/\4/g;"
#Infield twin uppercase's must match!
observed result --> aBcB_aCfC
expected result --> c_f

perl -pe同じ質問を繰り返してください!

問題は、シフトシンボルを認識した後にカウントをリセットせずに、参照カウントがシフト範囲を超えてしまうことです。

Fedora 20のsedバージョン4.2.2。

もちろん、私がここで言っている質問は非常に一般的で基本的な質問です。

実際のスクリプトは、長いテキストのための非常に複雑な生の解析です。

私の最初の目標は、各シフト質量グループの4番目の要素を印刷することでした。マッチングを分割する必要があるため、コードサイズが大幅に増加します。

誰かが私の混乱を減らすことができますか?

答え1

\x正規表現で開く中かっこが発生すると、左から右に番号が付けられたx番目のキャプチャグループでキャプチャされたエントリに展開されます

echo "abcd_aefghi" | sed -r "s/(a)(b)(c)(d)|(a)(e)(f)(g)/\8/g;"
                               1  2  3  4   5  6  7  8

この正規表現は2回一致します。開いたらabcd(8番目のキャプチャグループは何もキャプチャしません)、一度開いたらaefg8番目のキャプチャグループはg。 So はabcd何もないものに置き換えられ、 andaefgは変更されないままであるため、予想される結果がg得られます。_hi_ghi

存在する:

sed -r "s/(a)(b)(c)(d)()|((a)(e)(f)(g))/\8/g"
          1  2  3  4  5  67  8  9  10

わかりました。これはグループ_ehi8だからです。(e)

sed -r "s/(a)(b)(c)(d)()||||i am Not comment, Whats going here?|||||||((a)(e)(f)(g))/\8/g"
          1  2  3  4  5                                               67  8  9  10

違いなし。 (表示されませんが)のため、および||間に空の一致があり、最後に追加の一致があります(および一部はと一致h)。iperl

シフト演算子に基づいて数値をリセットそれほど有用なAPIではありません。例を交互に4番目のキャプチャグループに一致するものに拡張するには、いつでも次のことを実行できます

sed -r 's/(a)(b)(c)(d)|(a)(e)(f)(g)/\4\8/g'
          1  2  3  4   5  6  7  8

これはあなたにも同じことを与えるでしょうperl~の:

perl -lpe 's/(?|(a)(b)(c)(d)|(a)(e)(f)(g))/\4/g'
                1  2  3  4   1  2  3  4

(whereは\4何に拡張することもキャプチャすることができます(d)(g)

答え2

私が理解しているように、コードが複雑になり、実際の問題が解決されないため、与えられた答えに満足できないようです。実際の問題を知らずに役立つのは難しいです。

各シフトの4番目の部分を保存するには、おそらく別のタスクを実行する必要があります。

sed -r 's/abcd|aefg/\n&/g;s/\n...//g'

各一致を新しい行としてマークし、2番目のパスでは不要な3文字を含む新しい行を削除します(これはsedGNUでのみ機能しますが、他の文字でも同様のことができますsed)。

このアプローチはコードを増幅しません。時には仕事を変えなければならない時もあります。もちろん、文字だけを使用するのではなく、グループを使用してこれを行うこともできます。

ただし、これが実際の問題を解決できない場合(そしてどのように適応するのかわからない場合)、サンプルデータを使用して実際の問題を教えてください。

関連情報