特定のパターンが現れる行からファイルを切り取る方法は?

特定のパターンが現れる行からファイルを切り取る方法は?

サイズを小さくする必要があるファイルが多すぎます。私はほとんどの(すべてではない)ファイルに情報を失うことなく切り取ることができる終わりセクションがあることを発見しました。

Data 1
Data 2
something_unimportant_here END DATA
Rubbish 1
Rubbish 2

「END DATA」を含む行とその後のすべての行を削除し、そのパターンを含むファイルのみを変更してファイル(したがってすべて終了)を編集するにはどうすればよいですか?これにより、ディスクへの書き込みアクセスが最小限に抑えられます(多くのファイルと遅いディスク)。

可能であれば、ファイルの構文が正しいままになるように、ファイルに新しい最後の行(マイクローズタグ)を追加したいと思います。繰り返しますが、パターンを含むファイルでのみ可能です。

私はed次のようなものを使うつもりです。

echo ',s/END DATA/ ???? '\\n'q'\\n'wq' | ed "$file"

ところで管理できないようですね? ? ?部分的に本当です。

予想出力:

Data 1
Data 2
NEW END

ベストアンサー1

sed -i// perl -i/ ¹などのファイルの新しいコピーを作成するのではなく、ファイルを直接カットしてこれを行うことがedできるはずです。gawk -i /usr/share/awk/inplace.awk使用perl:

find . -name '*.txt' -type f -exec perl -ne '
  BEGIN{@ARGV=map{"+<$_"}@ARGV} # open files in read+write mode in the
                                # while(<>) loop implied by -n
  if (/END DATA/) {
    seek ARGV,-length,1; # back to beginning of matching line
    print ARGV "NEW END\n";
    truncate ARGV, tell ARGV;
    close ARGV; # skip to next file
  }' {} +

perl一致するものが見つかると、読み取りは停止され、それが NEW END\n記録される唯一のものであるため、I / Oが最小化されます。また、内部書き込みを行うため、ファイルメタデータ(所有権、権限、acl、スパース...)が保存され、ハードリンクが破損することはありません。

-exec {} +通話回数も最小限に抑えることができますperl


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

おすすめ記事