3

ファイルは最初は

$cat so/app.yaml 
application: SO
...

次のコマンドを実行します。空のファイルを取得します。

$sed s/SO/so/ so/app.yaml > so/app.yaml 
$cat so/app.yaml 
$

SED を使用してファイルを編集し、空のファイルを提供しないようにするにはどうすればよいですか?

4

4 に答える 4

16
$ sed -i -e's/SO/so/' so/app.yaml

イン-iプレースを意味します。

于 2009-04-06T18:59:54.350 に答える
5

パイプで使用>される は、パイプがすべて設定されたとき、つまりコマンド実行前に出力ファイルを開きます。したがって、入力ファイルはsed実行前に切り詰められます。これは、 だけでなく、すべてのシェル リダイレクトの問題sedです。

Sheldon Young の回答は、インプレース編集の使用方法を示しています。

于 2009-04-06T19:07:30.293 に答える
5

仕事に間違ったツールを使用しています。sedストリームエディターです (それがsと呼ばれる理由ですed)。したがって、パイプ内のストリームの実行中の編集用です。edOTOH はファイルエディターでありsed、ストリームではなくファイルで動作することを除いて、できることはすべて実行できます。(実際には逆です:edは元のユーティリティでありsed、ストリーム用の一時ファイルを作成する必要がないクローンです。)

edは非常によく似た働きをしますsed(sedは単なるクローンであるため) が、重要な違いが 1 つあります。ファイル内を移動できますが、ストリーム内を移動することはできません。したがって、 のすべてのコマンドは、コマンドを適用するファイル内の場所edを示すアドレス パラメータを使用します。あなたの場合、ファイルのどこにでもコマンドを適用したいので、アドレスパラメータは単に「行から行へ」を意味し、デフォルトの forは(beginning-of-file) であり、デフォルトの forは(end-of) です。 -file) であるため、両方を除外すると、「ファイルの先頭からファイルの末尾まで」という意味になります。次に(代用) が続き、残りは とよく似ています。ed,a,baba1b$ssed

したがって、sedコマンドs/SO/so/は ed コマンドに変わります,s/SO/so/

また、edはファイル エディター、より正確には対話型のファイル エディターであるためw、ファイルを書き込み ( )、エディターを終了 ( q) する必要もあります。

全体はこんな感じです。

ed -- so/app.yaml <<-HERE
    ,s/SO/so/
    w
    q
HERE

同様の質問に対する私の回答も参照してください。

あなたの場合、パイプラインの実行は2段階のプロセスです。最初にパイプラインを構築してから実行します。>は、「ファイルを開き、切り詰めて、ファイル記述子 1 ( stdout) に接続する」ことを意味します。その後、パイプが実際に実行されます。つまり、sed が実行されますが、この時点で、ファイルは既に切り詰められています。

の一部のバージョンには、ファイルのインプレース編集用sedのパラメータもあり、 のように動作しますが、これを使用することはお勧めできません。多くの非 GNU システムでは動作しない、標準化されていない GNU の独自の拡張機能です。非 GNU システムを使用してからしばらく経ちましたが、最後に使用したのは、Solaris も OpenBSD も HP-UX も IBM AIX もこのパラメーターをサポートしていませんでした。-isedededsedsed-i

于 2009-04-06T19:58:27.377 に答える
3

出力を編集中の同じファイルにリダイレクトすると、問題が発生すると思います。

標準出力を一時ファイルにリダイレクトする必要があり、sed が完了したら、元のファイルを一時ファイルで上書きします。

于 2009-04-06T19:03:34.000 に答える