POSIX sedは、アドレス範囲が既に削除された行から始まる `1d; 1,2d`に何を必要としますか?
この質問へのコメントで、さまざまなsed実装がかなり単純なプログラムで同意しない場合があり、私たち(または少なくとも私)は、仕様が実際にそれに対して必要とするものを決定できませんでした。 問題は、削除された行から始まる範囲の動作です: 1d;1,2d そのコマンドに到達する前に範囲の開始が削除された場合でも、行2を削除する必要がありますか?私の当初の期待はBSD sedに沿って「いいえ」でしたが、GNU sedは「はい」と言っており、仕様テキストをチェックしても問題は完全には解決しません。 私の予想に一致するのは、(少なくとも)macOSとSolaris sed、およびBSD sedです。反対は(少なくとも)GNUとBusybox sedであり、多くの人々がここにいます。最初の2つはSUS認定で、他の2つはより普及している可能性があります。どの動作が正しいですか? 2アドレス範囲の仕様書には次のように記載されています。 sedのコマンドは、次のサイクルが終了しますかを開始するまでのユーティリティはその後、順番にそのアドレスがそのパターンスペースを選択するすべてのコマンドを適用しなければなりません。 そして 2つのアドレスを持つ編集コマンドは、最初のアドレスに一致する最初のパターンスペースから2番目のアドレスに一致する次のパターンスペースまでの包括的な範囲を選択します。[...]選択した範囲に続く最初の行から開始して、sedは最初のアドレスを再度探します。その後、プロセスが繰り返されます。 おそらく、ライン2がある 範囲内にかかわらず開始点が削除されたかどうかの、「第二に一致する次のパターン空間を介して第1のアドレスと一致する第1のパターン領域からの包含範囲」。一方、私は最初dが次のサイクルに移動し、範囲に開始する機会を与えないことを期待していました。UNIX™認定の実装は、私が期待したことを実行しますが、仕様で要求されていることを潜在的に実行しません。 いくつかの実例となる実験が続きますが、重要な問題は、削除された行で範囲が始まるときに何をすべき sedかです。 実験と例 問題の簡単なデモンストレーションはこれです。これは、行を削除するのではなく、余分なコピーを印刷します。 printf 'a\nb\n' | sed -e '1d;1,2p' これは、提供するsed入力の2行、aおよびb。プログラムは2つのことを行います。 で最初の行を削除し1dます。dコマンド意志 パターンスペースを削除し、次のサイクルを開始します。そして 各行が受け取る自動印刷に加えて、1から2までの行の範囲を選択して明示的に印刷します。したがって、範囲に含まれる行は2回表示されます。 私の期待は、これが印刷されることでした b ただ、1,21行目で到達できないため(d次のサイクル/行に既にジャンプしているため)範囲aが適用されず、範囲の包含は決して開始されず、削除されます。SolarisおよびBSDの一般的なsed非POSIXと同様に、macOSおよびSolaris 10 の準拠するUnixがこの出力を生成します。sedsed 一方、GNU sedは印刷します b b 範囲を解釈したことを示します。これはPOSIXモードでもそうでない場合でも発生します。Busyboxのsedは同じ動作をします(ただし、常に同じ動作とは限らないため、共有コードの結果ではないようです)。 さらなる実験 printf 'a\nb\nc\nd\ne\n' | sed -e '2d;2,/c/p' printf 'a\nb\nc\nd\ne\n' | …