次の 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
パターンの影響を受けないため、大体置き換えられません。ちょうど入力から渡されました。