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番目のキャプチャグループは何もキャプチャしません)、一度開いたらaefg
8番目のキャプチャグループは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
わかりました。これはグループ_ehi
8だからです。(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
)。i
perl
シフト演算子に基づいて数値をリセットそれほど有用な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文字を含む新しい行を削除します(これはsed
GNUでのみ機能しますが、他の文字でも同様のことができますsed
)。
このアプローチはコードを増幅しません。時には仕事を変えなければならない時もあります。もちろん、文字だけを使用するのではなく、グループを使用してこれを行うこともできます。
ただし、これが実際の問題を解決できない場合(そしてどのように適応するのかわからない場合)、サンプルデータを使用して実際の問題を教えてください。