2011-11-04 51 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之前看到的是什么样子的打印输出(见什么是逃脱)。