大きなテキストファイル(約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
これを処理するための最良の方法は何ですか?
私はこのように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としてバックアップします)。
さらに多くの検索パターンがある場合は、それらをファイルに保存して、そこから置換を読み取ることができます。たとえば、これらが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
でエスケープする必要があることを前提としています。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