Ваша команда sed
немного запуталась.
sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g"
Прежде всего, не используйте sed
с -i
, если вы все еще пытаетесь заставить что-то работать. Это просто рецепт уничтожения важных файлов.
Во-вторых, r
в remote_path
— это команда sed
, которая читает файл. Я почти уверен, что он ищет файл с именем emote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g
или хотя бы emote_paths
.В любом случае он не выйдет с ошибкой, если файл не существует.
Похоже, вы хотели что-то вроде
s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g
Команда становится
sed "s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
Или, если имя ветки находится в конце строки после последнего /
и строки remote_path
однозначно находит эту строку:
sed "/remote_path/s#/[^/]*\$#$BRANCH_NAME#" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
В идеале, однако, вы должны использовать для этого инструмент, поддерживающий JSON, например jq
:
jq ".remote_path = (.remote_path | split(\"/\") | .[-1] = \"$BRANCH_NAME\" | join(\"/\"))" \
input.json >output.json