使用grep和xargs,避免“未终止引用”错误

时间:2009-05-14 00:20:33

标签: grep xargs

我感到非常沮丧,以至于我觉得是时候提问了。

我正在尝试将网址中的电子邮件地址替换为1000页的硬编码。它位于FreeBSD 6.3服务器上。

这是我正在使用的命令:

grep -R --files-with-matches'Email \ @ domain.com'。 |排序| uniq | xargs perl -pi -e's / Email \ @ domain.com / Email \ @newdomain.com /'* .html

这是我不断得到的错误:

xargs:未终止的报价

奇怪的是,当我在3个文件(在嵌套结构中)的测试用例上运行该命令时,它的工作正常。我一直在谷歌搜索,大多数解决方案似乎处理后添加-print0。在xargs之后有一个-0。然而,这产生了一系列不同的错误,这些错误让我相信我把事情放在了错误的地方。

提前感谢您的帮助

3 个答案:

答案 0 :(得分:3)

Pax是对的。我会进一步纠正它:

grep -R --files-with-matches 'Email\@domain.com' . -print0 | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/'

编辑:

感谢kcwu,这是完整的FreeBSD:

grep -R --files-with-matches 'Email\@domain.com' . --null | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/'

请注意,我已删除sort和uniq。 --files-without-match被记录为“在第一场比赛中停止”,因此您不会获得重复文件。 -print0和-0确保(并处理)以空值终止的文件列表,这是至关重要的,因为POSIX允许文件名包含换行符。

请注意,我不知道perl,但我假设该部分大致相当于:

sed -i s/Email\@domain.com/Email\@newdomain.com/g

答案 1 :(得分:1)

为什么要给xargs提供HTML文件列表?该程序从管道(grep的输出)获取其文件列表。

答案 2 :(得分:0)

使用GNU Parallel:

grep -R --files-with-matches 'Email\@domain.com' . | sort | uniq | parallel -q perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/g'

观看介绍视频以了解详情:http://www.youtube.com/watch?v=OpaiGYxkSuQ