Вставка новой строки в заданную строку c с вкладкой в ​​сценарии bash с использованием sed вместе с переменной env - PullRequest
1 голос
/ 04 апреля 2020

У меня есть часть json, которая выглядит следующим образом:

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

и три переменные среды, определенные следующим образом:

auth_url=VALUE1
region_name=VALUE3
endpoint_type=VALUE2

Я хочу вставить 3 строки во входные данные файл сразу после строки 2, так что вывод будет

{
  "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 на переменную окружения.

1 Ответ

1 голос
/ 04 апреля 2020

Вы неправильно используете команду i. Вы должны поставить backsla sh после него, а не sla sh.

Furhtermore, переменная не раскрывается, поскольку она находится в одинарных кавычках. Попробуйте поместить его в двойные кавычки, например,

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

Я читал, что команда i nsert хочет, чтобы все, что следует за обратным символом sh, находилось на новой строке, что здесь не так, где у нас все в одной строке. Я предполагаю, что это 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,"
...