2016-08-24 64 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

一個相對簡單的bash溶液(變化*包含.foo爲*的.py或任何文件名模式適合您的情況):

#!/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("")的結尾是否保證是最後的")就行了?等等。