Цитирование в sed-исполнении из bash-скрипта - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь преобразовать одну команду sed в выполнение bash, однако возникла проблема, которую я не могу отождествить с цитированием или расширением переменных.

Рабочая команда прямо из консоли:

BASH> diff vault-config.rb vault-config.rb.backup
BASH> sed -n -r -i '/^.*vault_config.*resource.*$/{x;s/\n//p;x;p;s/.*//;h};//!H;${x;s/.*/# Insert File_109 vault for node n109\n$vault_config['"'"'resource'"'"']['"'"'File_109'"'"'] = '"'"'\/tmp\/File_109.json'"'"'\0/p}' "/tmp/vault-config.rb"
BASH> diff vault-config.rb vault-config.rb.backup
208,209d207
< # Insert File_109 vault for node n109
< $vault_config['resource']['File_109'] = '/tmp/File_109.json'

НЕ РАБОТАЮЩАЯ попытка преобразования в сценарий bash (с некоторой модульностью)

BASH> NODE="n109"
BASH> VAULT_ID="File_109"
BASH> VAULT_FILE="/tmp/File_109.json"
BASH> VAULT_RESOURCE="\$vault_config['resource']['File_109'] = '/tmp/File_109.json'"
BASH> VAULT_CONFIG_FILE="/tmp/vault-config.rb"

BASH> echo "DEBUG: NODE ${NODE}"
DEBUG: NODE n109
BASH> echo "DEBUG: VAULT_ID ${VAULT_ID}"
DEBUG: VAULT_ID File_109
BASH> echo "DEBUG: VAULT_FILE ${VAULT_FILE}"
DEBUG: VAULT_FILE /tmp/File_109.json
BASH> echo "DEBUG: VAULT RESOURCE ${VAULT_RESOURCE}"
DEBUG: VAULT RESOURCE $vault_config['resource']['File_109'] = '/tmp/File_109.json'
BASH> echo "DEBUG: VAULT_CONFIG_FILE ${VAULT_CONFIG_FILE//"/"/\/}"
DEBUG: VAULT_CONFIG_FILE \/tmp\/vault-config.rb

BASH> args=("-n" "-r" "-i" "'/^.*vault_config.*resource.*\$/{x;s/\\n//p;x;p;s/.*//;h};//!H;\${x;s/.*/#This is automated insert of key ${VAULT_ID} vault for node ${NODE}\\n${VAULT_RESOURCE}\\0/p}'" "${VAULT_CONFIG_FILE//"/"/\/}")
-bash: !H: event not found
BASH> #sed "${args[0]}" # <-- commented because previous command is failing

Результат равен -bash: !H: event not found после присвоения аргументам.Я пробовал различные формы escape в элементе args, а также в переменной VAULT_RESOURCE, так как считаю, что аргументам могут не нравиться одинарные кавычки внутри.

Когда я экранирую аргументы от ! до \!команда перестает работать, однако sed не работает, и кажется, что аргументы args в этом случае содержат только первые 3 аргумента.

Мой вывод после того, как я провел несколько часов с этой командой, заключается в том, что полученная ошибка не связана снастоящая ошибка и что-то в фоновом режиме согласно документации ! не нужно экранировать в двойных кавычках, но реальность другая

BASH> TEST="Test string !H"
-bash: !H": event not found
BASH> TEST="Test string \!H"
BASH> echo $TEST
Test string \!H

В качестве обходного пути можно поставить эту командувременный скрипт .sh и назовите этот скрипт, но он мне не нравится.

Что я делаю не так?Спасибо за любую помощь

...