2011-12-07 24 views
0

我想遞歸什麼也沒有取代「等等等等等等」 在我的授權區域:腳本語言來刪除文件許可序言

#region License 
blah blah blah 
blah blah blah 
#endregion 

#region License 
#endregion 

這應及時更換適用於所有我的.cs文件在一個特定的目錄(遞歸)。我用sed試過,但是因爲我在windows上,所以在結尾處遇到了一些問題。我怎樣才能做到這一點與perl(或python),或Windows本地的東西?

編輯:這裏是我想出瞭解決辦法,感謝大家在這裏!:

#/bin/bash 
list=`find . -name '*.cs' -o -name '*.h' -o -name '*.cpp'` 
for i in $list 
do 
perl -i~ -ne 'if (/#region License/../#endregion/) {print if /#(?:end)? region/;next};print' $i 
done 
+10

我希望這是你自己的許可證,而不是別人的... –

+0

我這樣做是爲了避免兩個分支之間大規模的合併衝突,如牌照文本被更改爲所有文件 – Jacko

回答

1
perl -ne 'if (/#region/../#endregion/) {print if /#(?:end)?region/;next};print' file 

...這離開「#地區許可證」,並在輸出「#endregion」線的要求。

+0

如何獲得這個覆蓋舊文件的修改? – Jacko

+1

@Jacko:要執行就地編輯,只需將開關更改爲:perl -i -ne ...如果要保留原始文件的副本(帶有後綴),請執行以下操作:perl -i.old -ne。 .. – JRFerguson

+1

謝謝。如果該文件不在當前目錄中,該腳本似乎不起作用。 (我用查找來枚舉所有的cs文件) – Jacko

1
#!/usr/bin/env python 

with open('input') as fd: 
    text=fd.read() 

old="""#region License 
blah blah blah 
blah blah blah 
#endregion 

""" 

new="""#region License 
#endregion 

""" 

print text.replace(old,new) 

添加一些os.walk遍歷目錄,要麼結果寫入stdout或替換原來的文件新的內容。見例如https://stackoverflow.com/a/5421671/297323

+1

不錯的「親吻」解決方案;並且只要許可證機構都是完全相同的文本,可能就足夠了。如果有一堆不同的許可證,可以輕鬆擴展以取代每個許可證! – SingleNegationElimination

0

讀取文件的行,如果以#region開始跳過每一行,則開始跳過下一行,如果行以#endregion結尾,則開始再次收集行,將最後一行輸出到文件中。

def filter_lines(lines): 
    newlines = [] 
    startmarker = '#region' 
    endmarker = '#endregion' 
    skip = False 
    for line in lines: 

     if line.startswith(startmarker): 
      newlines.append(line) 
      skip = True 
      continue 
     if line.endswith(endmarker): 
      skip = False 

     if not skip: newlines.append(line) 

    return newli 

未列名

5

像這樣的事情?

perl -i~ -pe 'undef $_ if /^#region License$/ .. /^#endregion$/' 
+1

範圍運算符引用任何好奇的人:http://perldoc.perl.org/perlop.html#Range-Operators –

+0

謝謝。所以,如果我的文件被稱爲foo.cs,我將如何調用它來覆蓋foo.cs? – Jacko

+0

'-i〜'表示它覆蓋你的文件,但是創建一個備份文件('foo.cs〜'在你的情況下) – choroba

0

蟒蛇,在情況許可的身體是在各種不可預知的方式各不相同:

#!/usr/bin/env python 

with open('input') as fd: 
    text=fd.read() 

try: 
    start, rest = text.split("#region License\n", 1) 
    middle, end = rest.split("#endregion\n", 1) 
    print "%s\#region License\n#endregion\n%s" % (start, end) 
except ValueError: 
    # didn't contain a properly formatted license: 
    print text 
0

我會做這樣的事情:

perl -i.orig -0777 -p -e 's/#region License.*?#endregion/#region License\n#endregion/s' test.cc 
  • -0777手段整個文件將被誹謗
  • -p正在使-e代碼成爲sur (<>){... print $ _} block
  • -i.orig做了適當的編輯,並創建了一個備份
  • s標誌在替換結束時使得。* in正則表達式匹配了EOL

使用發現,以確定哪些文件來處理

1

exvim -e)也許是一個不錯的選擇。

echo -e 'g/^#region License$/+1,/^#endregion$/-1d\nx' | ex program.cs 

  • g/.../+1,/.../-1 =>找到regexs之間的線(+1 =>一行波紋管,-1 =>一個上面的行)
  • d =>刪除
  • \n =>輸入
  • x =>保存並退出

在Windows中,請使用:

vim -c "g/^#region License/+1,/^#endregion/-1d" +x program.cs 
+0

THanks中添加此文本!這個工作,但它不能很好地擴展到大型項目。 – Jacko