web-dev-qa-db-ja.com

1つの大きなテキストファイルでの複数の検索および置換アクション

大きなテキストファイル(約2GB)があります。同じファイルに対して5つの検索と置換のアクションを実行したいのですが、これを1つのコマンドで実行したいと思います。通常、私はvimを使用し、ファイルを開き、1回の置換アクションを実行してから、次のアクションを実行します。3〜4回の検索の後、メモリの問題が原因でvimがクラッシュすることに気付いたので、1つの問題があります。

Vimで使用するコマンドの2つの例を次に示します。

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

これを処理するための最良の方法は何ですか?

11
SPRBRN

私はこのようにsedを使用します:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

-iオプションは「インプレース」置換を表します。このオプションの拡張子(-i.bakはyourfile.txtをyourfile.txt.bakとしてバックアップします)。

8
ssssteffff

さらに多くの検索パターンがある場合は、それらをファイルに保存して、そこから置換を読み取ることができます。たとえば、これらがreplacements.txtの内容であるとします。

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

次に、N個の置換のリストを読み取って、次のように置き換えることができます。

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

ノート:

  • これは、検索文字列にスペースが含まれておらず、奇妙な文字をreplacements.txtでエスケープする必要があることを前提としています。
  • 置換ごとに1つのsedが実行されますが、置換操作が多い場合は時間がかかる場合があります。
  • もう少し時間がかかることを気にしない限り、任意の数の置換(数千または数百万など)を処理できます。

別のオプションは、上記をsedスクリプトとして記述することです。

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

次に、ファイルに対してスクリプトを実行すると、すべての置換が一度に行われます。

sed -f replace.sed infile.txt 
6
terdon