ユニックス:出力をファイルの先頭に追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/7807004

  •  25-10-2019
  •  | 
  •  

質問

具体的には、次の組み合わせを使用しています >> そして tee カスタム エイリアスで、新しい Homebrew 更新をテキスト ファイルに保存し、画面に出力します。

alias bu="echo `date "+%Y-%m-%d at %H:%M"` \
    >> ~/Documents/Homebrew\ Updates.txt && \
    brew update | tee -a ~/Documents/Homebrew\ Updates.txt"

質問:もしそうしたい場合はどうすればいいですか 先頭に追加する この出力は私のテキストファイルにあります。ファイルの最後に追加するのではなく、ファイルの先頭に配置しますか?


編集1:誰かが以下の回答で報告したように、一時ファイルの使用は良いアプローチである可能性があり、少なくとも部分的には役に立ちました。

targetLog="~/Documents/Homebrew\ Updates.txt"
alias bu="(brew update | cat - $targetLog \
> /tmp/out1 && mv /tmp/out1 $targetLog \
&& echo `date "+%Y-%m-%d at %H:%M":%S` | \
cat - $targetLog > /tmp/out2 \
&& mv /tmp/out2 $targetLog)"

しかし、問題は STDOUT への出力 (以前は tee によって可能でした) であり、これをこの一時ファイルのアプローチに組み込むことができるかどうかはわかりません…?

役に立ちましたか?

解決

SEDはあなたのために喜んでそれをします -i 編集するには、例えば。

sed -i -e "1i `date "+%Y-%m-%d at %H:%M"`" some_file

他のヒント

これは、出力ファイルを作成することで機能します。

file.txtに初期コンテンツがあるとしましょう

echo "first line" > file.txt          
echo "second line" >> file.txt

したがって、file.txtは「下」テキストファイルです。次に、新しい「出力」ファイルにプレイエンドします

echo "add new first line" | cat - file.txt > output.txt # <--- Just this command

これで、出力にはコンテンツが必要になります。古い名前が必要な場合:

mv output.txt file.txt
cat file.txt

唯一シンプルで、 安全 bash ツールを使用して入力ファイルを変更する方法は、一時ファイルを使用することです。 sed -i バックグラウンドで一時ファイルを使用します (ただし堅牢にするため) sed もっと必要です)。

使用されるメソッドの中には、コマンドを 本物 データ ファイルの場合、それを実行します。 シンボリックリンク (変更するファイルに)。正しく対応しないと、リンクが切断され、リンクがリンクに変換される可能性があります。 本物 MODを受け取り、残りのファイルを作成します。 オリジナル 意図した MOD とシンボリックリンクのない実際のファイル (エラー終了コード結果なし)

これを回避するには sed, を使用する必要があります。 --follow-symlinks オプション。
他の方法の場合は、シンボリックリンクをたどる必要があることに注意してください (そのようなリンク上で操作する場合)。
一時ファイルを使用すると、 rm temp file 「ファイル」がシンボリックリンクではない場合にのみ機能します。

安全な方法の 1 つは、 sponge パッケージから もっと見る

シェルリダイレクトとは異なり、スポンジは出力ファイルを開く前にすべての入力を浸します。これにより、同じファイルから読み取り、書き込みを行うパイプラインを構築できます。

sponge この種の状況に対処するための一般的な方法です。

以下に例を示します。 sponge

hbu=~/'Documents/Homebrew Updates.txt'
{ date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu"

IMOがエコーと猫を使用することは、最も簡単な方法です。

echo "Prepend" | cat - inputfile > outputfile

または、例では基本的に置き換えます tee -a ~/Documents/Homebrew\ Updates.txtcat - ~/Documents/Homebrew\ Updates.txt > ~/Documents/Homebrew\ Updates.txt

編集:Hasturkunが述べたように、これは機能しません。

echo "Prepend" | cat - file | tee file

しかし、これはもうそれを行う最も効率的な方法ではありません...

これを試して http://www.unix.com/shell-programming-scripting/42200-add-text-begining-file.html 直接オペレーターまたはコマンドAFAIKはありません。エコー、CAT、およびMVを使用して効果を得ます。

{ date; brew update |tee /dev/tty; cat updates.txt; } >updates.txt.new
mv updates.txt.new updates.txt

なぜあなたがこれをしたいのか分かりません。このようなログには、後のエントリがファイルの後半に表示されることはかなり標準です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top