2016-06-08 51 views
0

我試圖執行遞歸搜索並替換多個文件中的文件內容。搜索並替換unix命令行,perl捕獲組爲空

鑑於以下若干文件:

example:{ 
    something: 'ha', 
    somethingElse: 'ah' 
} 

我想直到結束:

example:{ 
    something: 'ha', 
    somethingElse: 'ah', 
    somethingNew: 'ah ha' 
} 

在Mac OS X,我想從以下命令行從在一個父目錄中:

find . -type f -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:$1,\n\tsomethingNew: 'ah ha'/g" {} \; 

它幾乎工作,除了捕獲組被解釋爲空白導致我n:

example:{ 
    something: 'ha', 
    somethingElse:, 
    somethingNew: 'ah ha' 
} 

什麼問題?

而且不依賴於perl,我不介意的替代方法(可以使用sed例如)

+4

您需要使用單引號。 $ 1在perl之前由bash解釋,因此perl在看到它時是空的。或者只是逃避它,因爲你在替換中使用單引號。 '\ $' – 123

+0

謝謝@ 123這也是一種替代修復 –

+4

看起來有點像JSON或其他結構化數據格式。是嗎?因爲如果是這樣,正則表達式可能不是工作的工具。 – Sobrique

回答

1

感謝@123answer in the comments

您需要使用單引號。 $ 1在perl之前由bash解釋,因此perl在看到它時是空的。或者只是逃避它,因爲你在替換中使用單引號。

因此翻譯爲:

find . -type f -exec perl -p -i -e 's/somethingElse:(.*)/somethingElse:$1,\n\tsomethingNew: '\''ah ha'\''/g' {} \; 

或:

find . -type f -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:\$1,\n\tsomethingNew: 'ah ha'/g" {} \; 

這也可能是明智的這樣做時添加文件擴展名,一個猜測爲什麼:你可能會意外地從太執行高目錄和腐敗說版本控制文件,即

find . -type f -name '*.json' -exec perl -p -i -e "s/somethingElse:(.*)/somethingElse:\$1,\n\tsomethingNew: 'ah ha'/g" {} \; 

被刪除的最初接受的答案建議\1而不是$1。雖然這工作,它被其他評論者記錄爲bad practice