【问题标题】:Unix command for replacing distinct strings用于替换不同字符串的 Unix 命令
【发布时间】:2013-04-25 00:20:43
【问题描述】:

我有这个 sed 命令:

sed 's/old/new/g' file.txt

但它也替换了字符串“文件夹”中的旧版本。如果字符串的左侧或右侧没有字符,如何替换字符串?

【问题讨论】:

    标签: regex shell unix sed


    【解决方案1】:

    如果不挑剔,在两边插入空白对你有用。

    sed 's/ old / new /g' file.txt 
    

    【讨论】:

    • 在字符串的开头或结尾不起作用。不适用于任何其他形式的空白。不适用于其他单词终止字符。这是一大堆“不挑剔”。
    • \<...> -- 标记单词边界,上面的应该是对的。
    • 对于 GNU sed 来说是这样,但 POSIX 没有指定。 (pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html)
    【解决方案2】:

    使用\b:

    's/\bold\b/new/g'

    我通常坚持使用 perl:

    perl -pi -e 's/\bold\b/new/g' file.txt

    【讨论】:

    • \b only 保证适用于 perl; POSIX 标准 sed 不支持它。因此,这不是通常的习惯问题,而是任何想要使用此答案并有理由相信它会起作用的人的必要条件。
    • OP 没有进行就地替换。在你的 Perl 命令行中使用 -i 会使它危险地不等效。
    【解决方案3】:

    要与不支持 PCRE 字边界扩展的 sed 版本兼容,您需要自己模拟该扩展的效果:

    sed -r 's@(^|[^[:alpha:]])old($|[^[:alpha:]])@\1new\2@g'
    

    【讨论】:

    • 我想知道[[:space:]]应该是[^[:alpha:]]还是[^[:alnum:]]?标点符号和空格可能应该被允许作为分隔符。然而,这是一种可靠的方法,虽然很冗长。
    • @JonathanLeffler 好电话;采纳。
    【解决方案4】:

    这可能对你有用:

    sed 's/\<old\>/new/g' file
    

    顺便说一句,如果你想要相反的(使用 GNU sed):

    sed 's/\Bold\B/new/g' file
    

    【讨论】:

    • 第一种形式也是非 POSIX(但在 GNU sed 等中支持)。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2016-11-12
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多