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