Command line 如何进行递归查找&;在SVN签出中替换?

Command line 如何进行递归查找&;在SVN签出中替换?,command-line,replace,Command Line,Replace,我如何查找和替换每次出现的: foo 与 在/my/test/dir/目录树下的每个文本文件中(递归查找/替换) 但我希望能够在SVN签出中安全地执行此操作,并且不接触.SVN目录中的任何内容 与此类似,但现在有了SVN限制:这个怎么样 grep -i "search_string" `find "*.some_extension"` 这是在具有特定扩展名的文件中查找搜索字符串的一半解决方案…一旦您知道包含该字符串的文件,可以通过将其管道化到sed中轻松修改它。有几种可能性: 使用查找: 使

我如何查找和替换每次出现的:

foo

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

但我希望能够在SVN签出中安全地执行此操作,并且不接触.SVN目录中的任何内容

与此类似,但现在有了SVN限制:

这个怎么样

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

这是在具有特定扩展名的文件中查找
搜索字符串
的一半解决方案…一旦您知道包含该字符串的文件,可以通过将其管道化到sed中轻松修改它。

有几种可能性:

使用查找:

使用“查找”创建所有文件的列表,然后将它们传送到
sed
或您参考的答案中建议的等效文件,这相当简单,只需要扫描文件一次

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

find . -path '*/.svn' -prune -o -type f -print
然后,您可以通过管道将其传输到
xargs
调用中,或者按照您提到的问题中的建议,执行单独的替换。这里有很多关于不同选项的讨论,我不在这里重复,尽管我更喜欢以下版本:

使用递归grep:

如果您有一个带有GNU grep的系统,那么您也可以使用它来查找文件列表。这可能比find效率低,但它只允许您对匹配的文件调用
sed
,我个人认为语法更容易记住(或从手册页中找出):

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

使用GUI编辑器:

或者,如果您使用的是windows,请执行我所做的操作—获取NoteTab编辑器的副本(免费版本),并使用其“在磁盘上搜索并替换”命令,该命令会自动忽略隐藏的.svn目录,并且只起作用


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

这似乎是一种非常复杂的方式来执行
grep-R-i“搜索字符串”
,在这两种情况下,您都需要添加一些内容来排除SVN目录。@Brooks:这是一个更可移植的版本,因为并非所有的grep都有递归开关……我想您是说这样做的:find-路径'.svn'-prune-o-typef-print,但这似乎不起作用。这就是我要说的——而且,你是对的,它不起作用。我想我已经找到了原因,并将进行编辑以更正。当我在CentOS 7上执行递归grep时,仍然会得到.svn目录。如果我改为放置
--exclude dir='.svn'
,它们就会消失。
find . -path '*/.svn' -prune -o -type f -print
find . -path '*/.svn' -prune -o -type f -exec sed -i 's/foo/bar/g' {} +
sed -i 's/foo/bar/g' `grep -l -R --exclude-dir='*/.svn' 'foo' .`