2016-07-14 21 views
2

我有這個功能是這樣工作的替換函數調用使用正則表達式

Add(1,2); 
Add(3,4); 

而且需要這方面的

Add({num1 : 1, num2 : 2}); 
Add({num1 : 3, num2 : 4}); 

這發生在數百名在多個文件的地方更換,所以我想寫一個腳本,可以爲我做這個。

使用正則表達式我能找到的地方,這種情況

/Add\(.*\);/ 

但我不知道如何與我所需要的替換函數調用的內部。

我不確定什麼是用來編寫腳本的最佳語言。我打算使用JavasScript將它寫入節點,但如果在那裏有一個簡單的解決方案,就會使用Bash和sed。

+1

除了更改所有調用之外,還可以更改該方法,以便理解任一調用。在JavaScript中,您可以檢查第二個參數是「undefined」,然後從作爲第一個參數提供的對象中提取值。大多數其他語言理解默認值或正確的方法重載。 –

+0

對我來說,重要的是所有的調用都需要改變,所以它只接受一個對象。 – user2802557

+0

如果有'Add(1,2,3,4,5);'? –

回答

1

我會去:

perl -i -pe 's/Add\((\d+),(\d+)\)/Add({num1 : $1, num2 : $2})/' filename 

關於你的正則表達式,它不是完整的,並且將/Add\((\d+),(\d+)\)/分別照顧醒目的指示和捕獲第一和第二號到$1$2

這些標誌的工作方式如下:

  • -i確實就地編輯(這將改寫你的文件;如果你不舒服,要麼刪除標誌,以查看輸出或使用-i.bak來創建文件的備份
  • -p解析每一行,並打印它到底
  • -e(從「EVAL」)是什麼讓你運行一個班輪,而不是一個腳本
+0

我從來沒有用過Perl。我如何在特定的文件上運行這個? – user2802557

+0

只要你安裝了Perl,你可以在命令行中輸入上面的行;使用'-i.bak'版本,以便保留原始文件的備份副本。 –

+0

謝謝你完美的作品! – user2802557

2

您可以使用替換爲適當的字符串。

var regex= /(Add\()(\d+),(\d+)(\))/g, 
 
    replace = '$1{num1: $2, num2: $3}$4' 
 

 
console.log('Add(3,4);'.replace(regex, replace));

+0

如果有'Add(1,2,3,4,5)','? –

+0

它需要另一個替換字符串的另一個正則表達式,該操作沒有提及它。 –

+0

我爲此提供了[通用JS解決方案](http://stackoverflow.com/a/38373079/3832970)。 –

0

試試這個方法SED

sed 's/\([^(]\+.\)\([^,]\+.\)\([^)]\+\)\(.*\)/\1{num1 : \2,num2 : \3}\4/g' FileName 
0

這應該爲你工作:

sed -i 's/Add(\([0-9]*\),\([0-9]*\))/Add({num1 : \1, num2 : \2})/' file 

-i選項是編輯文件到位