【问题标题】:I have a question about the "sed" statement in bash (macOS)我对 bash (macOS) 中的“sed”语句有疑问
【发布时间】:2021-03-12 15:27:05
【问题描述】:

我刚刚开始在 macOS 中使用 (bash/zsh) shell 脚本。我遇到了“sed”语句的问题:

我设置了以下变量

var1=MACBOOKPRO

执行以下终端命令时:

echo $var1 | sed -- 's/IMAC/IM/g; s/IMACPRO/IMP/g; s/MACMINI/MM/g; s/MACMINIPRO/MMP/g; s/MACBOOK/MB/g; s/MACBOOKAIR/MBA/g; s/MACBOOKPRO/MBP/g; s/MACPRO/MP/g; s/POWERMAC/PM/g'

产生以下输出:MBPRO(这不是我想要的)

但是当使用以下命令时:

echo $var1 | sed -- 's/MACBOOKPRO/MBP/g; s/IMAC/IM/g; s/IMACPRO/IMP/g; s/MACMINI/MM/g; s/MACMINIPRO/MMP/g; s/MACPRO/MP/g; s/MACBOOKAIR/MBA/g; s/MACBOOK/MB/g; s/POWERMAC/PM/g'

我得到了不同的(但正确的输出)! - MBP

有人知道为什么会这样吗?

提前感谢您的回复 查理

【问题讨论】:

    标签: bash macos sed scripting


    【解决方案1】:

    s/MACBOOK/MB/g;MACBOOKPRO 变成MBPRO

    【讨论】:

    • 您可以添加到您的答案中,即模式按指定的顺序应用。
    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @gdogg371 请了解 NAA 标志的含义。
    【解决方案2】:

    因为它按照您指定的顺序执行替换。您的变量匹配 /MACBOOK//MACBOOKPRO/。当第一个模式在列表中较早时,它将MACBOOK 前缀替换为MB

    当你有这样的重叠模式时,你应该把较长的放在第一位。

    另一种选择是使用^$ 更改您的模式,使其锚定以匹配整个字符串:

    echo $var1 | sed -- 's/^IMAC$/IM/g; s/^IMACPRO$/IMP/g; s/^MACMINI$/MM/g; s/^MACMINIPRO$/MMP/g; s/^MACBOOK$/MB/g; s/^MACBOOKAIR$/MBA/g; s/^MACBOOKPRO$/MBP/g; s/^MACPRO$/MP/g; s/^POWERMAC$/PM/g'
    

    【讨论】:

    • Barmar,感谢您的快速回答。不幸的是,第二个答案/建议确实给了我一个错误(调整 maCOS Mojave):sed: 1: "s/^IMAC$/IM/g; s$/IMACP ...": bad flag in substitute command: '/'
    • 抱歉,我在尝试自动添加所有 ^ 和 $ 时搞砸了。
    • 编辑了答案以修复它。
    • 感谢 Barmar,原因是要按字母顺序列出,所以我刚刚将其颠倒过来:echo $var1 | sed -- 's/POWERMAC/PM/g; s/MACPRO/MP/g; s/MACBOOKPRO/MBP/g; s/MACBOOKAIR/MBA/g; s/MACBOOK/MB/g; s/MACMINIPRO/MMP/g; s/MACMINI/MM/g; s/IMACPRO/IMP/g; s/IMAC/IM/g;';) 这很有效,而且是我喜欢的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2020-12-30
    • 2017-02-22
    • 2019-05-06
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多