この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
)、次を使用できます。a
i
awk
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
コードパラメータを引用しようとしています。