Обратите внимание, что ваш «стандартный 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
, разумеется.
В вашем скрипте две ошибки:
sh
в macOS — это очень старая версия оболочки bash
, и в ней есть ошибка, из-за которой вы не можете использовать несбалансированные кавычки в документах здесь -при подстановке команд:
$ a=$( cat <<'END'
> "
> END
> )
> sh: unexpected EOF while looking for matching `"'
(Мне пришлось нажать Ctrl+D после )
в конце.)
Это можно сделать, установив более новую оболочку bash
из менеджера пакетов Homebrew (или эквивалентного )или используя оболочку zsh
в macOS.
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