查找并替换特定目录中的文件中的字符串

时间:2015-05-12 09:22:02

标签: regex sed find pattern-matching

我有一个模式需要在多个目录中的.hpp.h.cpp文件中替换。

我已阅读Find and replace a particular term in multiple files个问题以寻求指导。我也在使用this教程,但我无法实现我打算做的事情。所以这是我的模式。

throw some::lengthy::exception();

我想用这个替换它

throw CreateException(some::lengthy::exception());

我怎样才能做到这一点?

更新:

此外,如果some::lengthy::exception()部分是变体以使其针对每个搜索结果进行更改,该怎么办? 像

这样的东西

throw some::changing::text::exception();

将转换为

throw CreateException(some::changing::text::exception());

3 个答案:

答案 0 :(得分:2)

您可以使用sed表达式:

sed 's/throw some::lengthy::exception();/throw CreateException(some::lengthy::exception());/g'

并将其添加到find命令中,以检查.h.cpp.hpp个文件(来自List files with certain extensions with ls and grep的想法):

find . -iregex '.*\.\(h\|cpp\|hpp\)'

所有在一起:

find . -iregex '.*\.\(h\|cpp\|hpp\)' -exec sed -i.bak 's/throw some::lengthy::exception();/throw CreateException(some::lengthy::exception());/g' {} \;

请注意sed -i.bak的使用情况,以便进行编辑,但会创建file.bak备份文件。

变量模式

如果您的模式不同,您可以使用:

sed -r '/^throw/s/throw (.*);$/throw CreateException(\1);/' file

这是以throw开头的行中的替换。它捕获throw之后的所有内容,直到;并将其打印回来,包围在CreateException();`。

测试

$ cat a.hpp 
throw some::lengthy::exception();
throw you();
asdfasdf throw you();
$ sed -r '/^throw/s/throw (.*);$/throw CreateException(\1);/' a.hpp 
throw CreateException(some::lengthy::exception());
throw CreateException(you());
asdfasdf throw you();

答案 1 :(得分:0)

您可以尝试以下sed命令。

sed 's/\bthrow some::lengthy::exception();/throw CreateException(some::lengthy::exception());/g' *.cpp

添加内联编辑-i参数以保存更改。

答案 2 :(得分:0)

您可以使用以下内容:

sed 's/\b(throw some::lengthy::exception());/throw CreateException(\1);/g'