Правильно назначить команду sed

Обратите внимание, что ваш «стандартный JSON» на самом деле не является JSON (перед закрывающим ]вHTTP_SERVER)стоит лишняя запятая.

Кроме того, sedбудет работать только в том случае, если исходный код отформатирован так, как вам нужно, он не будет работать для произвольного JSON (, который может не иметь разрывов строк ).

Таким образом, лучшим решением является использование jq, как в

$ jq --arg list "$list_of_machine" '.HTTP_SERVER|=.+($list|split(" "))' < your_file.json 
{
  "MNN_server": [
    "master02.sys645.com"
  ],
  "HTTP_SERVER": [
    "master01.sys645.com",
    "worker01.sys645.com",
    "worker02.sys645.com",
    "worker03.sys645.com",
    "worker04.sys645.com",
    "worker05.sys645.com"
  ]
}

со скважиной -, сформированной your_file.json, разумеется.

0
27.08.2021, 09:52
1 ответ

В вашем скрипте две ошибки:

  1. shв macOS — это очень старая версия оболочки bash, и в ней есть ошибка, из-за которой вы не можете использовать несбалансированные кавычки в документах здесь -при подстановке команд:

    $ a=$( cat <<'END'
    > "
    > END
    > )
    > sh: unexpected EOF while looking for matching `"'
    

    (Мне пришлось нажать Ctrl+D после )в конце.)

    Это можно сделать, установив более новую оболочку bashиз менеджера пакетов Homebrew (или эквивалентного )или используя оболочку zshв macOS.

  2. sedв macOS не имеет опции -r. Чтобы использовать расширенные регулярные выражения с sedв macOS, используйте-E(это также поддерживается GNU sedв настоящее время ). Однако ваше выражение не использует расширенные функции регулярных выражений, поэтому просто удалить параметр тоже можно. macOS sedтакже не может использовать -в качестве аргумента опции -для -fдля обозначения «чтения со стандартного ввода». Вместо этого используйте /dev/stdin.

Предложение:

#!/bin/zsh

PODS_PODFILE_DIR_PATH='/Users/path/to/file'

# just a comment

hash_in_podfile=$(sed -n -f /dev/stdin -- $PODS_PODFILE_DIR_PATH/Podfile <<'END'
s/^ *pod ['"]XXX["'],.*:commit *=> *["']([^'"]*)["'].*$/\1/p
END
)

echo $hash_in_podfile

Если все, что вы хотите сделать, это вывести значение, не используйте промежуточную переменную:

#!/bin/zsh

PODS_PODFILE_DIR_PATH='/Users/path/to/file'

# just a comment

sed -n -f /dev/stdin -- $PODS_PODFILE_DIR_PATH/Podfile <<'END'
s/^ *pod ['"]XXX["'],.*:commit *=> *["']([^'"]*)["'].*$/\1/p
END
4
27.08.2021, 11:23

Теги

Похожие вопросы