このsed設定が空のファイルに何も挿入しないのはなぜですか?

このsed設定が空のファイルに何も挿入しないのはなぜですか?

テキストファイルの最初の行にコンテンツを挿入すると考えられるこの構文を見つけましたsed。ただし、ファイルに既存のコンテンツがある場合にのみ機能するように見え、ファイルが空の場合は何もしません。なぜ?既存のファイルの内容に関係なく、ファイルの最初の行にテキストを挿入するより良い構成は何ですか?

$ rm -f ./foo
$ touch foo
$ sed -i "1 i\hello world" foo
$ cat ./foo
$ echo "whatever" >> ./foo
$ cat ./foo
whatever
$ sed -i "1 i\hello world" foo
$ cat ./foo
hello world
whatever
$

ベストアンサー1

Sedはファイルの各行で動作しますが、ファイルに行がない場合、sedは機能しません。通常、awkはより柔軟性を提供します。

GNUを試してくださいawk

gawk -i inplace 'BEGINFILE{print"hello world"} 1' foo

上記は空かどうかに関係なく機能fooします。

awkGNU()がない場合は、gawk次のものが必要です。

awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo

どのように動作しますか?

コマンドラインからファイルが起動する前にBEGINFILE{print"hello world"}記録されますhello world。これは、ファイルが空であるかどうかに関係なく発生します。

ファイルの各行について、その行1を印刷する awk の略語です。

GNU awkの場合は-i inplacesedと同じです-i

おすすめ記事