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


11

大きなテキストファイル(約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

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

回答:


8

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

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

-iオプションは「インプレース」置換を表します。このオプションに拡張子を付けて、ファイルのバックアップを作成するようにsedに指示できます(-i.bakyourfile.txtをyourfile.txt.bakとしてバックアップします)。


早い!答えだけではありません;-) 5つの検索と置換を含むこのスクリプトは、vimでファイルを開くだけで約10倍高速です。とはいえ、混乱したことがあります。最初は.bakファイルが編集されたファイルだと思っていましたが、もちろんオリジナルです。
SPRBRN 2013

2 GBのファイルで10回の検索と置換アクション(数千のヒット)を一度に実行します。メモリの問題はありません。平均的なデスクトップで2分未満-超!
SPRBRN 2013

1つの質問...置換文字列のドットをエスケープします。これは必要ですか?
SPRBRN 2013

1
どういたしまして@rxt :)実際、そうです。エスケープされていないドットをの置換文字列で使用できますsed。私が試したところ、うまくいきました。UnixとLinuxのStackexchangeには優れたスレッドがあり、受け入れられる答えは、エスケープする文字としてドットを言及していません。
ssssteffff 2013

2
@rxtあなたは文字列を置き換えて言った、申し訳ありませんが、そこでエスケープする必要はありません。
terdon 2013

6

さらに多くの検索パターンがある場合は、それらをファイルに保存し、そこから置換を読み取ることができます。たとえば、次の内容だとし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交換ごとに1つ実行されますが、多くの交換操作がある場合は時間がかかることがあります。
  • 少し時間がかかることを気にしない限り、任意の数の置換(数千または数百万など)を処理できます。

別のオプションは、上記を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 

、、、その他のオプションの+1」代替品をファイルに保存しておくと便利です。(覚えておきたいと思います...)
mpy 2013年

「その他のオプション」の+1は、カスタムスクリプトではなくネイティブ機能を使用しているため、移植性/共有性も高い
David Cook

@DavidCookに感謝しますが、他のものよりネイティブでもポータブルでもありません。最初のアプローチはPOSIXシェルループを使用することで、2番目とまったく同じように移植できます。シェルループを使用しているため、速度は非常に遅くなります。
terdon 2017年

そのとおりです。sedスクリプトファイル形式は、replacements.txtファイルと共有する必要があるスクリプトではなく組み込みのsed機能を使用するため、移植性が高いということです。それにもかかわらず、どちらも素晴らしいオプションです!
David Cook
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.