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目录.有关使用该选项的讨论,请参阅此问题 - 尽管请注意他们的模式错误.因此,要打印出所有文件,您将使用:prune
find
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上.