1. ホーム
  2. bash

[解決済み] コマンドでファイルを使用し、出力を切り詰めることなく同じファイルにリダイレクトするにはどうすればよいですか?

2022-09-12 08:37:39

質問

基本的には、ファイルからテキストを入力として受け取り、そのファイルから行を削除し、出力を同じファイルに送り返したいのです。それがより明確であるならば、これらの線に沿った何か。

grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > file_name

を実行すると、空白のファイルになってしまいます。 何かいい方法はないでしょうか?

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

bashはまずリダイレクトを処理し、それからコマンドを実行するので、それはできません。つまり、grepがfile_nameを見るときには、すでに空になっているのです。しかし、一時ファイルを使用することはできます。

#!/bin/sh
tmpfile=$(mktemp)
grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > ${tmpfile}
cat ${tmpfile} > file_name
rm -f ${tmpfile}

というように mktemp を使って tmpfile を作成しますが、POSIXでないことに注意してください。