我的代码示例
var='
content="
line1:'$1'
line2:'$2'
"
for lines in ${content[@]}
do
echo print $lines
done
'
我想将上述内容插入到文件中的特定字符串之后。
我正在使用以下命令,但它对我不起作用,因为它仅将字符串插入文件中。
我正在尝试什么:
sed -i '/pattern/a\ Hello world' destination.sh
我想要的方式:
sed -i '/pattern/a\ '`echo "$var"`'' destination.sh
答案1
假设只需要插入文本一次,我可能不会a
在这里使用编辑命令,而是r
从文件中读取:
cat <<END_CODE | sed '/pattern/r /dev/stdin' destination.sh
content=( line1:${1@Q} line2:${2@Q} )
for lines in "\${content[@]}"; do
echo print "\$lines"
done
# Above loop shorter: printf 'print %s\n' "\${content[@]}"
END_CODE
(请注意文本块中更正的 shell 代码,假设$1
和$2
应该在插入的代码中展开,并且在运行插入的代码之前不应展开其他变量。)
或者,如果您想保留var
变量:
printf '%s\n' "$var" | sed '/pattern/r /dev/stdin' destination.sh
如果您需要多次插入代码,请将文本写入真实文件并以r
相同的方式读取该文件:
sed '/pattern/r mycode' destination.sh
您的代码的问题是您试图将变量的值插入到sed
编辑代码中,这是一个单引号字符串。变量不会在单引号字符串内展开。您可以切换到使用双引号,但是您会遇到一个问题,即确保插入的数据不会破坏编辑脚本的语法(例如,如果除最后一行之外的任何行不以 结尾\
)。因此使用r
它来代替会更安全、更方便a
。
如果您使用的是 macOS,请务必将您的系统bash
从默认的本机版本升级到更新版本。你可以这样做Homebrew 包管理器。另请注意,sed -i
在 macOS 上的工作方式与在 Linux 等上的工作方式不同(请参阅如何使用 sed -i (就地编辑)实现可移植性?)。
答案2
将here-doc与临时文件一起使用:
cat > tmp.txt << EOF
content="
line1:'\$1'
line2:'\$2'
"
for lines in \${content[@]}
do
echo print \$lines
done
EOF
sed "/pattern/r tmp.txt" file
rm tmp.txt