</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
-s
sed に各ファイルを個別に処理するよう指示します。
すべてのファイルが完了する前に終了したくないので、残りの行ではなく sed
最初から印刷するように変更します。明示的に要求されない限り、印刷しないようにsedに指示します。このコマンドは、sedにファイルの先頭から一致する最初の行まですべての行を印刷するように指示します。<\/foo:bar>
-n
0,/<\/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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
答え3
ファイルを内部編集すると、ファイルが破損する可能性があります。代わりに、次の例のように変更を新しいファイルに書き込みます。
find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/\"/\"/g; s/'\"'\"'/\'/g' {} > {}_Html_Passed.txt"
上記のsedコマンドは各ファイルを読み取り、並列コマンド(参照:並列インストール)これを対応する新しい出力ファイルに書き込みます。
また、sedコマンド内の二重引用符は、並列コマンド自体で必要なため、\でエスケープする必要があります。
findコマンドの-maxlength値は必要に応じて調整できます。
このコードは、ブラウザのレンダリングの問題なしに、Webにあらゆる種類のスクリプトを公開したい人にも役立ちます。また、html preタグを使用してスクリプトを囲むことも役立ちます。