我感到非常沮丧,以至于我觉得是时候提问了。
我正在尝试将网址中的电子邮件地址替换为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。然而,这产生了一系列不同的错误,这些错误让我相信我把事情放在了错误的地方。
提前感谢您的帮助
答案 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