このsedコマンドがすべての行を印刷するのはなぜですか?

このsedコマンドがすべての行を印刷するのはなぜですか?

このsedコマンドは、なぜ sed /^a/,/i$/p 「a」で始まり、「i」で終わる行だけでなく、すべての行を印刷するのですか?それがどのように機能するのかわかりませんsed /BEGIN/,/END/p

標準入力:

arthuri
John
Johnny
Michael 

標準出力:

arthuri
arthuri
John
John
Johnny
Johnny
Michael
Michael

答え1

sedデフォルトでは、dパターン空間は、コマンドが呼び出されない限り、各サイクルの終わりに印刷されます。

この機能は、このオプションを使用するか、-nスクリプトの最初の行を次に設定することで無効にすることができます。sed#n

sedしたがって、ここでは基本的に印刷する以外に返品a最初の行で始まり、終わる行で始まるパターンスペースを印刷します。以来で終わりますi

入力の最初の行はarthuri()で始まりますaが、その終わり以降は行がないため、範囲は終わらずにすべてのi/^a/,/i$/が印刷されます(デフォルトでは最後に2回印刷されるため)。

sed範囲には常に最低2行が含まれます(入力の最後の行から始まる特別な場合は除く)。

開始行と終了行を同じにするには(で始まり、終了する場合と同じようにarthuri)、次を使用できます。aiawk

awk '/^a/, /i$/'

またはperl:

perl -ne 'print if /^a/ .. /i$/'

aで始まり終わる行を印刷するには、iアドレス範囲を使用しないでください。

sed '/^a/!d; /i$/!d'

または:

sed '/^a.*i$/!d'

または:

sed -n '/^a.*i$/p'

ここでは以下を使用することもできますgrep

grep -x 'a.*i'

^*およびは$多くのシェル構文の特殊文字です。通常、sedコードパラメータを引用しようとしています。

関連情報