我对 bash 中的 "sed" 语句有疑问 (macOS)

I have a question about the "sed" statement in bash (macOS)

我刚开始在 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

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

提前感谢您的回复 查理

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

因为它按照您指定的顺序执行替换。您的变量匹配 /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'