この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

答え2

を本当に使用したい場合は、sed次のことができます。

$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo

fooこれは、有無、空であるかどうかに関係なく機能します。

最初のコマンドは、ifexistsの末尾にecho "FPM" >> foo「FPM」行(必要なテキスト可能)を追加します。それ以外の場合は「FPM」行を作成します。foofoofoofoo

2番目のコマンドは、sed -i -e '1i\hello world' -e '$ d' foo最初の行の上に「hello world」を挿入し、ファイルfooの最後の行(「FPM」を含む)を削除します。

関連情報