ファイルは最初は
$cat so/app.yaml
application: SO
...
次のコマンドを実行します。空のファイルを取得します。
$sed s/SO/so/ so/app.yaml > so/app.yaml
$cat so/app.yaml
$
SED を使用してファイルを編集し、空のファイルを提供しないようにするにはどうすればよいですか?
ファイルは最初は
$cat so/app.yaml
application: SO
...
次のコマンドを実行します。空のファイルを取得します。
$sed s/SO/so/ so/app.yaml > so/app.yaml
$cat so/app.yaml
$
SED を使用してファイルを編集し、空のファイルを提供しないようにするにはどうすればよいですか?
$ sed -i -e's/SO/so/' so/app.yaml
イン-i
プレースを意味します。
パイプで使用>
される は、パイプがすべて設定されたとき、つまりコマンド実行前に出力ファイルを開きます。したがって、入力ファイルはsed
実行前に切り詰められます。これは、 だけでなく、すべてのシェル リダイレクトの問題sed
です。
Sheldon Young の回答は、インプレース編集の使用方法を示しています。
仕事に間違ったツールを使用しています。sed
はストリームエディターです (それがsと呼ばれる理由ですed
)。したがって、パイプ内のストリームの実行中の編集用です。ed
OTOH はファイルエディターでありsed
、ストリームではなくファイルで動作することを除いて、できることはすべて実行できます。(実際には逆です:ed
は元のユーティリティでありsed
、ストリーム用の一時ファイルを作成する必要がないクローンです。)
ed
は非常によく似た働きをしますsed
(sed
は単なるクローンであるため) が、重要な違いが 1 つあります。ファイル内を移動できますが、ストリーム内を移動することはできません。したがって、 のすべてのコマンドは、コマンドを適用するファイル内の場所ed
を示すアドレス パラメータを使用します。あなたの場合、ファイルのどこにでもコマンドを適用したいので、アドレスパラメータは単に「行から行へ」を意味し、デフォルトの forは(beginning-of-file) であり、デフォルトの forは(end-of) です。 -file) であるため、両方を除外すると、「ファイルの先頭からファイルの末尾まで」という意味になります。次に(代用) が続き、残りは とよく似ています。ed
,
a,b
a
b
a
1
b
$
s
sed
したがって、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 もこのパラメーターをサポートしていませんでした。-i
sed
ed
ed
sed
sed
-i
出力を編集中の同じファイルにリダイレクトすると、問題が発生すると思います。
標準出力を一時ファイルにリダイレクトする必要があり、sed が完了したら、元のファイルを一時ファイルで上書きします。