1

我感到很沮丧,以至于我认为是时候问一个问题了。

我正在尝试在一个硬编码到 1000 个页面中的网站上替换一个电子邮件地址。它在 FreeBSD 6.3 服务器上。

这是我正在使用的命令:

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

这是我不断收到的错误:

xargs:未终止的报价

奇怪的是,当我在 3 个文件(嵌套结构)的测试用例上运行该命令时,它工作得很好。我一直在谷歌搜索,大多数解决方案似乎都处理在 . 和 xargs 之后的 -0。然而,这会产生一组不同的错误,让我相信我把东西放在了错误的地方。

在此先感谢您的帮助

4

3 回答 3

3

帕克斯是正确的。我会进一步将其更正为:

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 确保(并处理)一个以 null 结尾的文件列表,这很重要,因为 POSIX 允许文件名包含换行符。

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

sed -i s/Email\@domain.com/Email\@newdomain.com/g
于 2009-05-14T00:40:12.553 回答
1

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

于 2009-05-14T00:28:58.577 回答
0

使用 GNU 并行:

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

于 2011-07-21T08:49:41.073 回答