如何在SVN结账中进行递归查找和替换?

Jar*_*les 5 command-line replace

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

foo
Run Code Online (Sandbox Code Playgroud)

bar
Run Code Online (Sandbox Code Playgroud)

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

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

与此类似,但现在有了SVN限制:Awk/Sed:如何进行递归查找/替换字符串?

Bro*_*ses 10

有几种可能性:

使用find:

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

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

find . -path '*/.svn' -prune -o -type f -print
Run Code Online (Sandbox Code Playgroud)

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

find . -path '*/.svn' -prune -o -type f -exec sed -i 's/foo/bar/g' {} +
Run Code Online (Sandbox Code Playgroud)

使用递归grep:

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

sed -i 's/foo/bar/g' `grep -l -R --exclude-dir='*/.svn' 'foo' .`
Run Code Online (Sandbox Code Playgroud)

-l选项使grep仅输出文件名列表,而不是匹配行.

使用GUI编辑器:

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

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