このsedは "$a\"スクリプトに対して何をしますか?

このsedは "$a\"スクリプトに対して何をしますか?

私はこのsedコマンドを見つけましたが、それが何をしているのかわかりません。内部変更ファイルを使用していることがわかります-i。スクリプトを使用しており、-eスクリプトはです$a\。しかし、このスクリプトは何をしていますか?

sed -i -e '$a\' filename

答え1

他の人が言ったように、例えば存在するファイルの末尾に改行文字を追加するには?、GNU sed(およびその他の実装)の$a\場合、ファイルの末尾に改行文字がない場合は、ファイルの末尾に改行文字を追加します。

なぜそれが何をしているかは非常に明確ではなく、文書でもこれについて説明しません。しかし、ソースコードを確認してみると...

ドキュメントから始めましょう。$a\はいバリエーションa、特殊事例の活用GNU拡張:

GNU拡張として、a次のコマンドとテキスト-eより簡単なスクリプトのために、2つのパラメータに分割できます。

$ seq 3 | sed -e '2a\' -e hello
1
2
hello
3

$ sed -e '2a\' -e "$VAR"

aこのメソッドはsed追加するテキストキューを使用して実装され、append_queueキューを処理する必要がある場合名前の人dump_append_queue、第一歩は

output_missing_newline (&output_file);

必要に応じて不足している改行を追加します。追加されたテキスト〜する現在の行の終わりではなく、別の行に追加します。次に、キューの内容を追加します。

を使用すると、sed -i '$a\'必要に応じて行方不明の改行が追加され、キューが処理されます。ただし、キューが空であるため、他の変更は適用されません。

答え2

最後の行がない場合は、最後の行に改行文字が追加されます。

改行なしでファイルを作成する

$ printf 'line1\nline2' > file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2
0000013

sedが何をしているか見てみましょう:

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

再実行するとどうなりますか?追加するかどうかその他新しいチーム?

$ sed -i '$a\' file
$ od -c file
0000000   l   i   n   e   1  \n   l   i   n   e   2  \n
0000014

いいえ。

関連情報