1. ホーム
  2. shell

[解決済み] ファイルの先頭に付けるシェルワンプライナー

2022-06-22 14:19:11

質問

これはおそらく 複雑な解決策です。 .

私は">"のような単純な演算子を探しています、しかし前置のためです。

残念ながら、それは存在しません。次のようなことをしなければならないでしょう。

 mv myfile tmp
 cat myheader tmp > myfile を実行します。

もっとスマートなものはないか?

どのように解決するのですか?

この ハック は、即席の回答で、うまくいき、多くのアップヴォートを得ました。その後、この質問が人気になり、時間が経つにつれて、怒った人々が「ちょっとはうまくいったけど、変なことが起きた」「全然うまくいかなかった」と報告し始め、一時期猛烈にダウンボートされました。 楽しいですね。

この解決策は、システム上のファイル記述子の正確な実装を利用するもので、実装は nix 間で大きく異なるため、その成功は完全にシステムに依存し、決定的に移植不可能であり、漠然とした重要なものであっても当てにすべきではありません。

さて、そのようなことはさておき、答えはこうでした。


ファイルに対して別のファイル記述子を作成する ( exec 3<> yourfile ) を作成し、そこに書き込む ( >&3 ) に書き込むことで、同一ファイルの読み書きに関するジレンマが解消されるようです。私は600Kのファイルをawkで処理しました。しかし、'cat' を使って同じトリックを試すと失敗します。

前置詞を変数として awk に渡す ( -v TEXT="$text" ) に変数として渡すことで、'sed' でこのトリックを行うことを妨げるリテラルの引用符の問題を克服します。

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3