sed パターンマッチングの奇妙な動作

sed パターンマッチングの奇妙な動作

次の 2 つの例は予想される動作です。
「xxx2」および「xxx@」は両方とも「xxx」。パターンと一致するので問題ありません。

$ echo abc1xxx2abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxx2abc3

$ echo abc1xxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxx@abc3

以下の2つの例も予想される動作です。
「xxx@」と「xxxy」はどちらも「xxx」と一致します。パターン
ですが、次の「@」文字がパターンと一致しないため、出力はありません。

$ echo abc1xxx@@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
no output

$ echo abc1xxxy@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
no output

ただし、上記の例で「y」を「x」に変更すると、
次の文字が「@」であっても突然パターンが一致するため、
この動作を理解できません。

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxxx@abc3abc4

ベストアンサー1

何が起こっているのかを確認できるように、パターンを少し変更してみましょう^.*

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*/\1/p'
xxx@abc3abc4

xxx@したがって、一致し、abc3その後にabc4。これはパターンがorの3つのabc.出現を見つけるので、完全に正当で予想されますxxx.

出力行の先頭はabc1xパターンの影響を受けないため、大体置き換えられません。ちょうど入力から渡されました。

おすすめ記事