BSD sed,如何插入带有变量的字符串

BSD sed, How to insert a string with variables

我正在使用 MacOSX 创建这个 bash 脚本,该脚本会检查其他文件并将内容相互比较,从而创建一个递增计数器。使用计数器的函数必须首先执行,以便变量包含信息,因此最好的选择似乎是通过命令 sed 插入该行。有什么方法可以忽略单引号创建的文字部分吗?这也是 BSD sed,而不是 GNU sed。或者,如果除了使用 sed 之外还有其他选择,我很想知道该怎么做。

代码:

sed -i '' '3i\
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}' $LOGFILE
sed -i '' '3i\
There are a total of ${NATIONALCOUNT} Pokemon in the world, and you need ${NATNEEDCOUNTER}' $LOGFILE

输出:

There are a total of ${NATIONALCOUNT} Pokemon in the world, and you need ${NATNEEDCOUNTER}
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}

变量在'...'内部没有展开。 将单引号更改为双引号。 另一方面, 双引号内的 \ 将被解释为转义其后的换行符, 但在这种情况下,对于 sedi 命令,您需要它是文字 \。 在双引号内,您需要将其写为 \.

放在一起,这样写:

sed -i '' "3i\
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}" $LOGFILE

正如@EdMorton指出的那样,使用单引号会更健壮, 并根据需要中断它以仅双引号使用变量的特定部分,如下所示:

sed -i '' '3i\
There are a total of '"${ALOLANCOUNT}"' Pokemon in Alola, and you have '"${HAVECOUNTER}"', and need '"${ALOLANNEEDCOUNTER}" $LOGFILE

这个更健壮, 因为这样你就不需要扫描整个字符串,如果有可能需要转义的东西,比如我第一个提案中的\