如何找到并替换每次出现的事件:
foo
与
bar
在/ my / test / dir /目录树下的每个文本文件中(递归查找/替换)。
但我希望能够在SVN结账时安全地进行,而不是触摸.svn目录中的任何内容
与此类似,但现在有SVN限制:Awk/Sed: How to do a recursive find/replace of a string?
答案 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>