テキストファイルの最初の行にコンテンツを挿入すると考えられるこの構文を見つけました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
します。
awk
GNU()がない場合は、gawk
次のものが必要です。
awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo
どのように動作しますか?
コマンドラインからファイルが起動する前にBEGINFILE{print"hello world"}
記録されますhello world
。これは、ファイルが空であるかどうかに関係なく発生します。
ファイルの各行について、その行1
を印刷する awk の略語です。
GNU awkの場合は-i inplace
sedと同じです-i
。
答え2
を本当に使用したい場合は、sed
次のことができます。
$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo
foo
これは、有無、空であるかどうかに関係なく機能します。
最初のコマンドは、ifexistsの末尾にecho "FPM" >> foo
「FPM」行(必要なテキスト可能)を追加します。それ以外の場合は「FPM」行を作成します。foo
foo
foo
foo
2番目のコマンドは、sed -i -e '1i\hello world' -e '$ d' foo
最初の行の上に「hello world」を挿入し、ファイルfoo
の最後の行(「FPM」を含む)を削除します。