sedで逆参照を一致させる方法は?

sedで逆参照を一致させる方法は?

sedこのサイトで削除を実行する1行のコマンドが見つかりました$PATH。理解できない概念があります。一致セクションに保存されている一致を使用して重複を検索し、一致を\1\2

以下の例では理由を理解できません。\1 いつもそうではない 1111。テストケースでは、\1パターン空間でマッチングがさらに進行することを明確に示していますが、なぜそうなのかわかりません。

sedスクリプト( sed_cmd):

p  #debug
:b
s/[:;]\([^:;]*\)\([:;].*\)[;:]\1/;y\1yx\2x/p
s/[yx]//g   #debug remove the field indicators for the next pass
s/;/:/g     #debug
tb
s/^\([^:]*\)\(:.*\):\1/\1\2FixedFirst/
aDone

テストコマンド+出力:

echo "0000:1111:2222:3333:4444:1111:2222:3333:0000" | sed -f sed_cmd
0000:1111:2222:3333:4444:1111:2222:3333:0000
0000;y1111yx:2222:3333:4444x:2222:3333:0000
0000:1111;y2222yx:3333:4444x:3333:0000
0000:1111:2222;y3333yx:4444x:0000
0000:1111:2222:3333:4444FixedFirst
Done

ベストアンサー1

代替コマンドのパターンは次のとおりです[:;]\([^:;]*\)\([:;].*\)[;:]\1\1最後に注意してください。これは、最初のグループに一致するすべてのテキストがパターンの末尾に表示される必要\([^:;]*\)があることを意味します。

パターンスペースは最初です0000:1111:2222:3333:4444:1111:2222:3333:0000。パターンはと一致:1111:2222:3333:4444:1111し、1111最初のグループと\1最後のグループと一致します。

最初の交換ラウンド後のパターンスペースは次のようになります。変更到着する0000:1111:2222:3333:4444:2222:3333:0000。パターンスペースで使用して一致すると1111、一致するものは残り\([^:;]*\)ません。したがって、パターンを一致させることはできず、正規表現エンジンは他のものを試みます。この場合、最初のグループで次に使用可能な一致を使用することが有効です。1111\12222

おすすめ記事