首页 > 解决方案 > 使用 sed 和 env 变量在 bash 脚本中使用选项卡在特定行插入新行

问题描述

我有一部分 json 如下所示:

{
  "openstack": {
    "admin": {
      "username": "admin",
      "password": "password",
      "tenant_name": "test"
    },

和这样定义的三个环境变量

auth_url=VALUE1
region_name=VALUE3
endpoint_type=VALUE2

我想在第 2 行之后的输入文件中插入 3 行,以便输出为

{
  "openstack": {
    "auth_url": VALUE1,
    "region_name": VALUE2,
    "endpoint_type": VALUE3,
    "admin": {
      "username": "admin",
      "password": "password",
      "tenant_name": "test"
    },

如何使用 SED 完成,我在下面尝试过

sed -e '3i/\t"auth_url":$auth_url,' -i account_2.json

但它不仅/在第 3 行添加了额外的内容,而且实际上也没有替换$auth_url为环境变量。

标签: bashsed

解决方案


您正在滥用该i命令。你必须在它后面加上反斜杠,而不是斜杠。

此外,该变量没有展开,因为它是在单引号中。试着把它放在双引号中,像这样

sed "3i\    \"auth_url\":$AUTH," yourfile

我读过insert 命令希望反斜杠后面的任何内容都在换行符上,但这里不是这种情况,我们将所有内容都放在一行上。我猜那是允许它的 GNU sed。

要插入三行,你可以使用这个

sed "3i\    \"auth_url\":$SHELL\n    \"auth_url\":$SHELL\n    \"auth_url\":$SHELL" os

它也适用于逗号,因为它们没有特殊含义:

sed "3i\    \"auth_url\":$SHELL,\n    \"auth_url\":$SHELL,\n    \"auth_url\":$SHELL,"

推荐阅读