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


11

</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

回答:


19

試してください:

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

-s 各ファイルを個別に扱うようにsedに指示します。

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

この-sオプションは、BSD / OSX sedでは使用できません。


@ fd0ありがとうございます。-sBSD / OSX sedの欠如を指摘するように回答が更新されました。
John1024

以下のためのGNU sedのは-iオプションは意味-s...ありsed、このソリューションがないと動作しません実装-sオプションは?
Sundeep 2017年

7

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

GNUの場合awk

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

perl

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.