如何在文件中的某个字符串后面插入采用 cli 参数的变量文本?

如何在文件中的某个字符串后面插入采用 cli 参数的变量文本?

我的代码示例

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

相关内容