sed - 複数のファイルに変更を適用する

sed - 複数のファイルに変更を適用する

</foo:bar>" "を含む何百ものファイルがあります。

cc
bb
aa
</foo:bar>
dd
xx
vv

一度に変えたいです。

cc
bb
aa
</foo:bar>

sed は正確なファイル名を指定すると正常に動作します。

sed -i "/</foo:bar>/q" 99999.txt

しかし、一度にすべて変更しようとすると、何の結果も得られません。

 sed -i "/<\/foo:bar>/q" *.txt

答え1

努力する:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-ssed に各ファイルを個別に処理するよう指示します。

すべてのファイルが完了する前に終了したくないので、残りの行ではなく sed最初から印刷するように変更します。明示的に要求されない限り、印刷しないようにsedに指示します。このコマンドは、sedにファイルの先頭から一致する最初の行まですべての行を印刷するように指示します。<\/foo:bar>-n0,/<\/foo:bar>/p<\/foo:bar>

この-sオプションはBSD / OSX sedでは機能しません。

答え2

</foo:bar>ファイルが見つかったら読み取りを中止するには:

GNUの使用awk:

gawk -i /usr/share/awk/inplace.awk '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

そしてperl

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt

存在するgawk使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答え3

ファイルを内部編集すると、ファイルが破損する可能性があります。代わりに、次の例のように変更を新しいファイルに書き込みます。

find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/\"/\&quot;/g; s/'\"'\"'/\&#39;/g' {} > {}_Html_Passed.txt"

上記のsedコマンドは各ファイルを読み取り、並列コマンド(参照:並列インストール)これを対応する新しい出力ファイルに書き込みます。

また、sedコマンド内の二重引用符は、並列コマンド自体で必要なため、\でエスケープする必要があります。

findコマンドの-maxlength値は必要に応じて調整できます。

このコードは、ブラウザのレンダリングの問題なしに、Webにあらゆる種類のスクリプトを公開したい人にも役立ちます。また、html preタグを使用してスクリプトを囲むことも役立ちます。

源泉:私のオープンソースプロジェクト

関連情報