59

STARTremoveThisComment読み取り行と読み取り行を削除したいシェルスクリプトで sed コマンドを使用しようとしていますremoveThisCommentEND

を使用して新しいファイルにコピーすると、それを行うことができます

sed 's/STARTremoveThisComment//' > test

しかし、入力と出力に同じファイルを使用してこれを行うにはどうすればよいでしょうか?

4

5 に答える 5

93

sed -i(または拡張バージョン--in-place)は、あまり高度でない実装で通常行われるプロセス、つまり出力を一時ファイルに送信し、その名前を元のファイルに戻すプロセスを自動化します。

-iインプレース編集用であり、元のコピーを保持するためのバックアップ サフィックスを提供することもできます。

sed -i.bak fileToChange
sed --in-place=.bak fileToChange

どちらも元のファイルを に保持しますfileToChange.bak

インプレース編集はすべてのsed実装で利用できるわけでsedありませんが、タグに従って、Linux のすべてのバリアントで利用できるGNUであることに注意してください。

より原始的な実装を使用している場合は、次のようなものを使用できます。

cp oldfile oldfile.bak && sed 'whatever' oldfile >newfile && mv newfile oldfile
于 2012-05-31T08:00:43.493 に答える
11

インプレース編集にはフラグ-iを使用し、通常のスクリプト式を指定するには-eを使用できます。

sed -i -e 's/pattern_to_search/text_to_replace/' file.txt

特定のパターンに一致する行を削除するには、より単純な構文を使用できます。dフラグに注意してください。

sed -i '/pattern_to_search/d' file.txt
于 2015-03-23T18:52:36.467 に答える
5

そのために sed を使用するべきではありません。この質問はばかばかしいほど頻繁に出てくるようで、非常に奇妙に思えます。一般的な解決策は非常に些細なことなので、sed、python、ruby などでそれを行う方法を人々が知りたいと思うのは奇妙に思えます。 . フィルタを入力に作用させて上書きしたい場合は、次の簡単なスクリプトを使用します。

#!/bin/sh -e
in=${1?No input file specified}
mv $in ${bak=.$in.bak}
shift
"$@" < $bak > $in

それを実行可能ファイル名のパスに入れるとinline、問題は一般的に解決されます。例えば:

inline input-file sed -e s/foo/bar/g

ここで、複数のバックアップを保持するロジックを追加する場合、またはバックアップの命名スキームを変更するオプションがある場合などは、1 か所で修正します。でファイルをインプレース処理するときに、バックアップ ファイルの 1-up カウンターを取得するコマンド ライン オプションは何perlですか? とはどうrubyですか?のオプションは異なりgnu-sedますか? どのようawkにそれを処理しますか?UNIX の重要な点は、ツールが 1 つのことしかできないということです。バックアップ ファイルの処理ロジックは 2 番目のことであり、除外する必要があります。ツールを実装する場合は、バックアップ ファイルを作成するロジックを追加しないでください。そのために2番目のツールを使用するようにユーザーに伝えます。統合は悪いです。モジュール性は良好です。それがユニックスのやり方です。

このスクリプトにはいくつかの問題があることに注意してください。たとえば、入力ファイルの権限/モードが変更される場合があります。他にも無数の問題があると思います。ただし、バックアップ ロジックをラッパー スクリプトに配置することで、これらの問題をすべてローカライズしsed、ファイルを上書きしてモードを変更することを心配する必要はありませんがpython、ファイルは所定の位置に保持され、inode は変更されません (これらは私が作成したものです)。すべてのツールが同じロジックを使用するわけではありませんが、ラッパー スクリプトは使用します)。

于 2012-05-31T13:07:18.447 に答える
0

私の知る限り、入力と出力に同じファイルを使用することはできません。1 つの解決策は、別のファイルに保存するシェル スクリプトを作成することですが、古い入力を削除し、出力の名前を入力ファイル名に変更します。

sed -e s/try/this/g input.file > output.file;mv output.file input.file
于 2012-05-31T07:59:27.003 に答える