2016-08-24 4 views
0

私はプロジェクトに何十ものファイルを持っており、発生したすべてのファイルをsix.b("...")に変更したいのですが、b"..."に変更します。何らかの正規表現のbashスクリプトでそれを行うことはできますか?複数のファイルからsix.bを削除する

+0

「six.b」の出現は変更しないでください。例えば'six.begin'などなど、これをPythonとしてマークしました。Pythonソリューションも公開していますか? –

答えて

1

それはPythonで完全に可能だが、私が最初に私のプロジェクトツリーのバックアップを作成し、その後になります。


import re 
import os 

indir = 'files' 

for root, dirs, files in os.walk(indir): 
    for f in files: 
     fname = os.path.join(root, f) 
     with open(fname) as f: 
      txt = f.read() 
     txt = re.sub(r'six\.(b\("[^"]*"\))', r'\1', txt) 
     with open(fname, 'w') as f: 
      f.write(txt) 
     print(fname) 


+0

'six.b(" asdf ")'を 'b(" asdf ")'に変えてかっこをかけるつもりはありませんか?私は、 'six.b(" asdf \ ")") 'のようなエスケープされた引用符で文字列を出力すると間違った出力をすると思います。' ''引用符も三重引用符も扱いませんが、修正された出力を生成する代わりに、それらに触れてください。 – user2357112

+0

コードに修正を適用しました。 – ArekBulski

1

*の.pyまたは何のファイル名のパターンに比較的単純なbashの溶液(変更*の.fooというのあなたの状況が)スーツ:

#!/bin/bash 

export FILES=`find . -type f -name '*.foo' -exec egrep -l 'six\.b\("[^\"]*"\)' {} \; 2>/dev/null` 
for file in $FILES 
do 
    cp $file $file.bak 
    sed 's/six\.b(\(\"[^\"]*[^\\]\"\))/b\1/' $file.bak > $file 
    echo $file 
done 

注:

  1. それだけconsidますER /それはそれはそれは、例えば、組み込み\")を処理しません

  2. を変更し、各ファイルの「.BAK」コピーを行いますパターン

  3. に一致するファイルを変更しますsix.b("asdf\")")ですが、私が扱っているファイルについて詳しく知ることなく、その問題に対する些細な解決策があることはわかりません。 six.b("")の最後は")となることが保証されていますか?

関連する問題