【问题标题】:bash sed replace a line number in a file containing a colonbash sed 替换包含冒号的文件中的行号
【发布时间】:2022-03-02 02:03:44
【问题描述】:

我使用的是 RHEL 7.3。 myfile.txt 的第 12 行如下所示:

图片:/currentimage/myimage

我需要一个 bash 脚本将其更改为:

图片:/newimage/otherimage

我试过这样做:

sed -i '12s/image: /currentimage/myimage/image: /newimage/otherimage/' ./myfile

但它失败了:

sed: unknown option to `s'

【问题讨论】:

  • gnu.org/software/sed/manual/html_node/… "/ 字符可以被任何给定的s 命令中的任何其他单个字符统一替换。/ 字符(或任何其他字符)只有在 regexp 或 replacement 前面有一个 \ 字符时才能出现在它。"

标签: bash sed


【解决方案1】:

您正在使用/ 作为您的sed 分隔符,并且在您的路径中使用它。尝试使用 | 作为分隔符。

sed -i '12s|image: /currentimage/myimage|image: /newimage/otherimage|' ./myfile

此外,您还可以像 \/ 一样转义文件路径中的每个 /。

【讨论】:

  • 您可能会提到,当您不希望分隔符的行为如此时,可以转义它,即使在这种情况下会很麻烦。
  • @Kip K 谢谢,这很好用。我不知道你能做到这一点。我想是把冒号作为我问题的根源,而不是转义字符。管道解决方案非常容易阅读。
【解决方案2】:

如果您可以使用Awk,则使用代表正在处理的行的NR 变量移动到第12 行非常简单,

awk 'NR==12{$2="/newimage/otherimage/"}1' myfile > tmp && mv tmp myfile

> tmp && mv tmp myfile 部分相当于sed 中的-i 选项,用于就地修改文件的间接方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2020-04-24
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2022-12-22
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多