私はしばしばシェルの中からファイルを「編集」しようとすることを発見します。words.txt
その文字を含むすべての行を削除したいと思います。金利。次に、次を実行します。
$ grep -v e words.txt > words-without-e.txt
$ mv words-without-e.txt words.txt
多くの人が次のコマンドを実行すると、なぜ空のファイルが残るのか混乱しています(私はファイルがありません)。
$ grep -v e words.txt > words.txt
grep: words.txt: input file is also the output
--in-place
一部のコマンドには、次のような内部動作用の特別なフラグがあります。sed(1)
)これを許可します。利用できるsponge(1)
しかし、この場合、ファイル名を2回入力する必要がありますが、気に入らません。
$ grep -v e words.txt | sponge words.txt
私は非常に便利だと思う関数を定義しました。
function inplace { "${@:2}" < "$1" | sponge $1 }
これで、次のことができます。
$ inplace words.txt grep -v e
私はこれが「ストリーム処理」、つまり標準入力を受け取り、処理して標準出力を生成するコマンドに制限されることを知っています。しかし、これは多くのコマンドに当てはまります。
私は間違った場所を探しているかもしれませんが、特に内部編集に関する質問がどれくらい頻繁に出てくるかを考えると、まだ同様の定義を誤って見つけられませんでした。
- 同じ目的を達成するための一般的なユーティリティはありますか?
- そのような関数を定義したことがありますか?あなたの定義は何ですか?それは何と呼んでいますか?
- なぜこれはより頻繁に起こりませんか?それとも、私はただ逃したのでしょうか?
答え1
私が知っている限り、すべてのコマンドが正しく機能することを可能にする汎用ユーティリティはありません。
通常、人々はプログラムでファイルをその場で編集したい場合、sed
またはperl
with-i
パラメータを使用します。
おそらく、これがまさにこのトピックが頻繁に登場しない理由です。考えるのとは異なり、ファイルを編集できるユーティリティがあればそれほど必要ありません。