【问题标题】:xargs and sed creating unwanted files when replacing strings in filesxargs 和 sed 在替换文件中的字符串时创建不需要的文件
【发布时间】:2014-01-18 00:37:39
【问题描述】:

我有一个名为test 的文件夹,其中有两个文件style.css 和一个名为.DS_Store 的隐藏文件。我的目标是将test 下所有文件中的所有“changefrom.this”字符串递归替换为“to.this”。所以我想出了:

folder_root="test"

# change text in files
find $folder_root/ -type f -print0 | xargs -0 -n 1 sed -i -e 's/changefrom.this/to.this/g'

例如,虽然字符串确实在 style.css 文件中被替换,但执行会输出错误:

sed: RE error: illegal byte sequence  

我在test 文件夹中获得了一些新文件:style.css-e!2766!.DS_Store。没想到。这是怎么回事?

【问题讨论】:

    标签: bash unix sed xargs


    【解决方案1】:

    你能用find -exec sed试试这个简化的命令吗:

    find "$folder_root/" -type f -exec sed -i 's/changefrom\.this/to.this/g' '{}' +
    

    如果 changefrom.this 不是您使用的实际模式,请告诉我们该模式是什么,因为它可能会导致问题。

    【讨论】:

    • 我想要替换确切的字符串changefrom.this。点在那里是因为它是字符串的一部分。它不应该表示任何其他内容
    • 您可以使用:sed -i 's/\<changefrom\.this\>/to.this/g' 进行精确匹配。点需要被替换以匹配文字点。
    【解决方案2】:

    试试这个:

    find $folder_root/ -type f -print0 | LC_ALL=en_US.CP437 xargs -0 -n 1 sed -i -e 's/changefrom.this/to.this/g'
    

    如果有效,问题是您的终端编码与文件的编码不匹配。 CP437 没有坏字节,所以这修复了 7 位 ascii 中的正则表达式。

    【讨论】:

    • 现在没有错误了,字符串被替换了但是创建了两个新文件:style.css-e.DS_Store-e
    • 创建新文件的原因是'-i' 使用文件扩展名来保存备份文件('-e')。 “-e”可能是“-E”(扩展正则表达式),您需要将零长度扩展名传递给 sed 以告诉它不要保存备份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2020-08-20
    • 2011-08-10
    相关资源
    最近更新 更多