sedの「a」コマンドを使用して行プレフィックスを使用することは移植可能ですか?

sedの「a」コマンドを使用して行プレフィックスを使用することは移植可能ですか?

私は次のような興味深い動作を見つけました。

$ printf '%s\n' line{1..2} | sed $'1a\\\nPREFIX'
line1
PREFIXline2
$ 

興味深いことに、この動作は次にのみ適用されます。最後コマンドの後に他のコマンドを配置するには改行が必要なので、Sedスクリプトはコマンドを使用します。

挿入コマンドでも機能します。

$ printf '%s\n' line{1..2} | sed $'1i\\\nPREFIX'
PREFIXline1
line2
$ 

この動作を信頼できますか?

どんな方法でも言及されているわけではありません。SedのPOSIX仕様。ただtext1つ以上の行で構成できると言います。 (改行で終わらないと、まだ減っていますか?)

複数行の挿入でも機能します。

$ printf '%s\n' line{1..2} | sed $'1a\\\n ****/\n1i\\\n/****\\\n * '
/****
* line1
****/
line2
$ 

ベストアンサー1

文字列を行プレフィックスとして使用するには、行開始アンカーであるreplacement(s)とreplacementを使用します。^

$ printf 'line1\nline2\n' | sed '1s/^/PREFIX/'
PREFIXline1
line2

a行の後に行を追加し、i他の行の前に行を挿入するために使用されます。aコマンドはi行の変更には使用されず、行の追加にのみ使用されます。

「この行動を信じられますか?」 Stéphane Chazelasがコメントで指摘したように、「これは明らかにバグです」。 GNUはsed説明された動作を表示しません。


「改行で終わらないとまだ減ってるの?」という質問についてPOSIX は「ライン」を次のように定義します。

<newline>ゼロ個以上の非文字と終了文字のシーケンスです<newline>

したがって、この質問に対する答えは「いいえ、線ではありません」です。

おすすめ記事