コマンドでファイルを使用し、出力を切り捨てずに同じファイルにリダイレクトするにはどうすればよいですか? [コピー]

コマンドでファイルを使用し、出力を切り捨てずに同じファイルにリダイレクトするにはどうすればよいですか? [コピー]
cat package.yaml > package.yaml

上記の内容は切り捨てられ、package.yamlファイルが空になります。つまり、cat空の出力になります。

ファイルの切り捨てを防ぐ方法は?一時ファイルを使用する以外の方法はありませんか?たぶん変数ですか?

ベストアンサー1

ファイルの内部編集を許可するすべてのユーティリティは、内部的に結果を一時ファイルに書き込み、操作が完了した後に元のファイルをその一時ファイルに置き換える方法でこれを行います。


文書できる内部変更は可能ですが、既存のデータを上書きしたりファイルの長さを延長したりするだけです。これは、dd次のユーティリティを使用して実行できます。

$ cat file.txt
hello world
abc abc 123 123

$ cat insert.txt
hello!

$ dd if=insert.txt of=file.txt bs=1 seek=6 conv=notrunc
7+0 records in
7+0 records out 
7 bytes transferred in 0.000 secs (30918 bytes/sec)

$ cat file.txt
hello hello!
bc abc 123 123

ここでは、insert.txtまずファイル内の6バイトの前を見て(空白をスキップ)、内容を変更して内容を挿入します。書き込み操作の終わりに出力ファイルが切り捨てられるのを防ぎます。file.txthelloconv=notrunc

省略すると、if=insert.txtキーボードから任意のテキストを挿入できます。ここで「挿入」は実際には間違った用語です。 「上書き」は何が起こっているのかをよりよく説明するかもしれません(最後に改行文字が2行目の最初の文字を上書きすることを参照してくださいinsert.txt)。

しかし、このようにファイルを編集したくありません。

おすすめ記事