2011-11-04 45 views
1

我在我的django應用程序中重命名了一些東西,我想遞歸搜索並替換所有模板中的標籤。我試圖用find和sed這樣做。用sed遞歸替換django模板標籤

find . -name *.html -exec sed -i 's/\{\{\s*oldtag\s*\}\}/{{ newtag }}/g' {} \; 

我得到這個錯誤。

sed: -e expression #1, char 44: Invalid preceding regular expression 

好吧,所以我嘗試了一大堆不同的事情,試圖使它工作。我嘗試了翻轉並翻轉大括號。我嘗試使用[\ t]而不是\ s。似乎沒有任何工作。某些組合不會給出錯誤,但它們也不會查找或替換任何內容。更糟糕的是有時我會得到這個錯誤。

find: paths must precede expression: index.html 

該路徑如何在表達式之前? 。是路徑,它緊跟在find命令之後。它在所有表達式之前。

+0

您是否嘗試過使用管道而不是'-exec'來簡化此操作?我不是'find'或'sed'專家,但是我會讓'sed'處理一個文件,然後使用管道傳遞其餘的文件。 – nrabinowitz

回答

1

嘗試:

find . -name '*.html' -exec sed -i 's|{{\s*oldtag\s*}}|{{ newtag }}|g' {} + 

隨着一些假設:

  • 的sed實現識別\ S轉義序列和-i選項
  • 找到實現支持{} +語法
0

你應該逃避'\字符。這應該工作:

find . -name *.html -exec sed -i \'s/{{\\s*oldtag\\s*}}/{{ newtag }}/g\' {} \; 

提示:你可以隨時插入echo隻字sed之前看到的是什麼樣子的打印輸出(見什麼是逃脫)。