![如何在 bash 脚本中的指定行号之后或之间插入变量的内容?](https://linux22.com/image/203578/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E6%8C%87%E5%AE%9A%E8%A1%8C%E5%8F%B7%E4%B9%8B%E5%90%8E%E6%88%96%E4%B9%8B%E9%97%B4%E6%8F%92%E5%85%A5%E5%8F%98%E9%87%8F%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我的脚本通过在第四行之后插入一些设置作为存储在变量中的文本块来修改配置文件。我知道 MacOS 版本的 sed 存在一些不兼容性,因此我安装了 GNU 版本,但我不知道正在运行哪个 SED。
#!/bin/bash
SCRIPT_LINES="for all "vars";\find Runtime ("stm32") use "c++";\n\n" sed -i'' "4i$SCRIPT_LINES"environment.cfg
SED 的语法毫无意义,我希望有一种替代方案,但似乎没有一个好的替代方案。如何将变量中包含的文本块从 bash 脚本插入到另一个文件中?
答案1
如果您发现 sed 的语法无意义,您可以通过多种不同的方式在某个位置插入一行。一种很容易理解的方法:
( head -n 4 environment.cfg && echo "$script_lines" && tail -n +5 environment.cfg ) > /tmp/tmp-environment.cfg
mv /tmp/tmp-environment.cfg environment.cfg
即,回显文件的前四行,然后回显变量,然后打印从第 5 行开始的所有内容。将结果存储在临时文件中,然后将其复制过来。
这样就可以避免sed
。 ☺
但我认为对于 GNU sed,这只是
sed -i "4a $script_lines" environment.cfg
对于 OS X sed:
sed -i '' "4a $script_lines" environment.cfg
要知道您正在运行什么版本:
sed --version
答案2
您可以改为使用(某些实现以某些不兼容的方式添加的perl
非标准扩展受到 的启发):-i
sed
perl
#! /bin/sh -
SCRIPT_LINES='for all "vars";find Runtime ("stm32") use "c++"
' perl -i -pe '$_ = "$ENV{SCRIPT_LINES}$_" if $. == 4' environment.cfg