【问题标题】:Need help editing files in place with sed需要帮助使用 sed 编辑文件
【发布时间】:2015-01-12 09:47:57
【问题描述】:

我正在尝试使用 sed 添加文件,但我不断收到此错误消息

sed: 1: "test.txt": undefined label 'est.txt'

这是我正在使用的命令

Desktop > sed -i 's/White/Black/' test.txt

我不确定我在这里做错了什么......任何帮助将不胜感激!提前致谢!

【问题讨论】:

    标签: bash unix sed terminal


    【解决方案1】:

    sed 的某些版本需要 -i 的参数。试试:

    sed -i.bak  's/White/Black/' test.txt
    

    或者(仅限 OSX/BSD),

    sed -i ''  's/White/Black/' test.txt
    

    如您所知,-i 告诉sed 进行就地编辑。用于备份原始文件的扩展名的参数。参数为空字符串,您的sed 可能不会保留备份文件。

    GNU sed 不需要 -i 的参数。 BSD sed (Mac OSX) 可以。

    详情

    考虑命令:

    sed -i 's/White/Black/' test.txt
    

    如果您的sed 需要-i 的参数,那么它会认为s/White/Black/ 就是那个参数。因此,它认为下一个参数test.txt 是它应该执行的sed 命令。这将被解释为“测试”命令t,如果测试为真,则跳转到标签est.txt。没有定义这样的标签。因此错误消息:

    sed: 1: "test.txt": undefined label 'est.txt'
    

    另类

    ThatOtherGuy 报告以下内容将在所有平台上正常运行:

    sed -i -e 's/White/Black/' test.txt
    

    ThatOtherGuy 指出,这一行的行为是依赖于平台的。使用 BSD sed,它会创建一个带有 -e 扩展名的备份文件。使用 GNU sed,不会创建备份。

    【讨论】:

    • 啊哈!这很有意义。非常感谢老哥的解释。顺便说一句,您指定的两个命令都运行良好!
    • sed -i -e '...' 可以在 GNU 和 OSX 上使用。
    • @thatotherguy 那么,在 OSX 上,不能使用 -e 进行备份扩展吗?很好。我更新了答案以包含您的代码。
    • @John1024 是的!问题是在 OS X 上它使用 -e 作为备份后缀,而在 GNU 上它看到 -e 作为引入 sed 命令,无论哪种方式它都是有效的并修改文件。