如何进行递归查找&在SVN结账时更换?

时间:2011-01-11 22:38:03

标签: command-line replace

如何找到并替换每次出现的事件:

foo

bar

在/ my / test / dir /目录树下的每个文本文件中(递归查找/替换)。

但我希望能够在SVN结账时安全地进行,而不是触摸.svn目录中的任何内容

与此类似,但现在有SVN限制:Awk/Sed: How to do a recursive find/replace of a string?

2 个答案:

答案 0 :(得分:10)

有几种可能性:

使用find:

使用find创建所有文件的列表,然后根据您引用的答案中的建议将它们传送到sed或等效文件,这非常简单,只需要扫描文件一次。

您使用与您引用的问题相同的答案之一,但在-path '*/.svn' -prune -o之后添加find .以删除SVN目录。有关将prune选项与find一起使用的讨论,请参阅this question - 但请注意,他们的模式错误。因此,要打印出所有文件,您可以使用:

find . -path '*/.svn' -prune -o -type f -print

然后,您可以将其传输到xargs电话或其他任何单独的替换中,如您引用的问题中所建议的那样。关于不同的选项有很多讨论,我不会在这里重现,虽然我更喜欢John Zwinck's answer的版本:

find . -path '*/.svn' -prune -o -type f -exec sed -i 's/foo/bar/g' {} +

使用递归grep:

如果您的系统使用GNU grep,您也可以使用它来查找文件列表。这可能不如find有效,但它确实允许您只对匹配的文件调用sed,我个人觉得语法更容易记住(或从联机帮助页中找出):

sed -i 's/foo/bar/g' `grep -l -R --exclude-dir='*/.svn' 'foo' .`

-l选项导致grep仅输出文件名列表,而不是匹配的行。

使用GUI编辑器:

或者,如果您正在使用Windows,请执行我的操作 - 获取NoteTab编辑器的副本(在免费版本中提供),并使用其search-and-replace-on-disk命令,该命令忽略隐藏.svn目录自动生效。

修改:将查找模式更改为*/.svn而不是.svn,添加了更多详细信息和其他一些可能性。但是,这取决于您的平台和svn版本:在某些情况下可能需要.svn而不需要*/,例如在CentOS 7上。

答案 1 :(得分:0)

这个怎么样?

grep -i "search_string" `find "*.some_extension"`

这是在具有特定扩展名的文件中查找search_string的中途解决方案....一旦您知道具有该字符串的文件,可以通过将其管道化为sed ....来轻松修改。 / p>