如何使用find,-exec,grep和sed与正则表达式来替换部分文本?

时间:2010-11-24 18:14:36

标签: regex macos sed find

好吧,我真的想创建一个在DeltaWalker中使用的过滤器来忽略只有特定行差异的文件,这样我就能识别出其他源代码发生变化的文件。 Stackoverflow正则表达式大师给了我几个很好的表达式,在OS X终端中产生了很好的find -exec grep结果,但对DeltaWalker结果没有影响。所以,我有另一个想法。

我记得一个名为sed的实用程序,我没有经验......但是,我相信它可以通过find的-exec开关调用。所以,我有以下内容并想知道是否有人知道如何混合使用sed来替换匹配的文本行: “Copyright(c)2008 - 2009”with“Copyright(c)2008 - 2010”

find . -exec grep -Hn '^.*Copyright (c) 2008 - 2009' {} \;

1 个答案:

答案 0 :(得分:13)

你可以这么做

find . -exec sed -r -e 's/(^.*)Copyright \(c\) 2008 - 2009/\1Copyright (c) 2008 - 2010/g' {} \;

我在这里假设您不想丢失版权之前就行的任何内容,并与.*匹配

但是,根据您的输入,它可能就像

一样简单
find . -exec sed -e 's/2009/2010/g' {} \;

请注意,在这两种情况下,我都没有修改文件,只是显示了修改内容的结果。我想在您真实的场景中,您希望将更改写回磁盘。为此,您需要-i开关到sed,因此:

find . -exec sed -r -i'' -e 's/(^.*)Copyright \(c\) 2008 - 2009/\1Copyright (c) 2008 - 2010/g' {} \;

值得注意的是,我在这里使用GNU sed语法。我没有方便测试的OS X盒,但BSD sed通常使用-E而不是-r来打开扩展的正则表达式。