我有一个问题是关于;sed";bash(macOS)中的语句
我刚刚开始在macOS中使用(bash/zsh)shell脚本。我在“sed”声明中遇到了一个问题: 我已经设置了以下变量我有一个问题是关于;sed";bash(macOS)中的语句,bash,macos,sed,scripting,Bash,Macos,Sed,Scripting,我刚刚开始在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/
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
有人能告诉我为什么会这样吗
提前感谢您的回复
Charly
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'
您可以在回答中添加模式是按照指定的顺序应用的。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@gdogg371请了解NAA标志的含义。巴尔马,谢谢你的快速回答。不幸的是,第二个答案/建议确实给了我一个错误(调整maCOS Mojave):
sed:1:“s/^IMAC$/IM/g;s$/IMACP…”:替换命令中的错误标志:“/”
对不起,我在尝试自动添加所有“^和$”时出错。编辑了答案以修复它。感谢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;';)代码>这很有效,这是我喜欢的方式。