Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我有一个问题是关于;sed";bash(macOS)中的语句_Bash_Macos_Sed_Scripting - Fatal编程技术网

我有一个问题是关于;sed";bash(macOS)中的语句

我有一个问题是关于;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/

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

有人能告诉我为什么会这样吗

提前感谢您的回复
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;';)这很有效,这是我喜欢的方式。