【问题标题】:grep and sed with spaces in filenamesgrep 和 sed 文件名中带有空格
【发布时间】:2013-06-22 04:51:25
【问题描述】:

目前,我有

grep -irl $schema $WORKDIR/ | xargs sed -i 's/'"$schema"'/EXI1/gI'

这不适用于带有空格的文件名。

任何想法,如何递归搜索和替换所有文件?

谢谢

【问题讨论】:

    标签: linux search replace sed grep


    【解决方案1】:

    -Z(又名--null)标志添加到grep,并将-0(又名--null)标志添加到xargs。 这将输出以 NUL 结尾的文件名,并告诉 xargs 读取以 NUL 结尾的参数。

    例如。

    grep -irlZ $schema $WORKDIR/ | xargs -0 sed -i 's/'"$schema"'/EXI1/gI'
    

    【讨论】:

    • 应该可以选择两次投票。
    【解决方案2】:

    使用 sed 查找应该可以工作:

    find $WORKDIR/ -type f -exec sed -i.bak "s/$schema/EXI1/gI" '{}' +
    

    find $WORKDIR/ -type f -print0 | xargs -0 sed -i.bak "s/$schema/EXI1/gI"
    

    【讨论】:

    • 此解决方案更好,因为它不会对每个文件搜索两次(一次使用 grep,一次使用 sed)。应该选择这个而不是另一个。
    • 上述命令不会像 grep 那样搜索文件的内容,它所做的只是找到 WORKDIR 中的所有文件。我的命令使用 grep 查找包含 $schema 的文件并将文件传递给 sed 进行替换,这样只有包含 $schema 的文件才会被触及。而 find 所有文​​件都被触及
    • 您实际上不需要使用 grep 进行搜索,因为使用 sed 无论如何您都在进行搜索和替换。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多