/(.+)\n\1/ 動作しますが、/(.*)\n\1/ どちらも動作する必要がある場合は動作しません。

/(.+)\n\1/ 動作しますが、/(.*)\n\1/ どちらも動作する必要がある場合は動作しません。

他の質問に答えた後、遊ぶことがわかりましたが、sed同じ結果は出ません.+.*どちらも複数の文字と一致する場合コンテキストアドレスから。
以下のコマンド1

sed -E '$!N;/(.+)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

印刷

one_more
two_more

さて、これが予想される結果です。
正規表現をで.+.*すなわち、1つ以上の文字到着0個以上の文字)は同じ結果を提供する必要がありますが、次の結果はそうではありません。

sed -E '$!N;/(.*)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

1行だけ印刷

two_more

ここで何が起こっているのでしょうか?


1:シンプルさと読みやすさのためにEREを使用しています。 BREでも同様です。

ベストアンサー1

これは/(.*)\n\1/単純な改行文字も一致するために発生します(\n空白文字列、改行文字、同じ最初から始めるのは空の文字列です)。

one_more\ntwoしたがって、あなたの例でも文字列と一致します。

sed -E '$!N;/^(.+)\n\1/!P;D'これを防ぐために、または同じ正規表現を固定する必要がありますsed -E '$!N;/^(.*)\n\1/!P;D'

おすすめ記事