【问题标题】:processing filelist produced by grep but names have spaces处理由 grep 生成的文件列表,但名称有空格
【发布时间】:2012-02-13 18:40:24
【问题描述】:

我正在尝试使用 grep 命令的输出来替换找到的所有文件。问题是找到的某些文件的名称中有空格。这是我使用的简化的 grep 命令(在多个邮件主机上查找多个名称)。

grep -Ril oldname@foo.com *

这会生成一个包含我需要的文件的列表,只列出文件名(-l 选项)。使用反引号我将文件名输入到 Perl 单行:

perl -pi -e 's/oldname\@foo\.com/newname\@bar.com/gi' `grep -Ril oldname@foo.com *`

当列出的所有文件的名称中都没有空格,但如果有空格,它就会中断。

通过 find 我知道我可以使用 -print0xargs -0,但似乎没有任何与 grep 等效的东西。

我可以将grep 的输出放入一个文件中,然后读取它,但现在我想知道这是否可以作为单行。

【问题讨论】:

    标签: grep whitespace backticks


    【解决方案1】:

    我的 grep 有一个 -Z --null 选项可以在每个文件名之后输出 NUL,你可以将它与 perl -0 一起使用。

    【讨论】:

    • 不知何故我没有看到。我可以发誓我阅读了 grep 的整个手册页。这在技术上解决了我的问题,但我仍然做错了什么。添加 Z 作为 grep 的开关会删除文件之间的新行。但是当我在我的 perl 命令中添加 -0 时,它不能正确识别文件分隔符。它现在抱怨它找不到(例如)file1.txtfile2.txtfile3.txt,它们是目录中的前三个文件。
    • 跟进我自己的评论,答案是使用 -Z 和 grep(如 jbowes 所述),然后使用 xargs -0 而不是 perl -0 将其发送到 perl。所以:grep -ZRilIE "foo" * | xargs -0 perl -pi -e 's/foo/bar/gi'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-12-12
    • 2010-09-28
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多