Bash - подстановочный параметр в родительском совпадении (SED/AWK)
Я работаю над небольшим сценарием, чтобы взять некоторые переменные, packageName, newVersion. Я погуглил и попробовал очень много, и это заставляет меня спрашивать.
Сценарий выполняется как: updatePackage.sh -p weblogic-pkg-1 -v 2.0.1-B3
Это гласит:
## Weblogic Deployment
'weblogic-pkg-1':
ensure: 'present'
deploymenttype: 'AppDeployment'
versionidentifier: '2.0.0-B2'
timeout: 60
stagingmode: "nostage"
remote: "1"
upload: "1"
target:
- "%{hiera('package_clustername')}"
targettype:
- 'Cluster'
localpath: '/opt/releases/staging/applications/weblogic-pkg-1/weblogic-pkg-1-2.0.0-B2.war'
Я пытаюсь заставить скрипт изменить номер версии, как только он соответствует пакету, поэтому желаемый результат:
## Weblogic Deployment
'weblogic-pkg-1':
ensure: 'present'
deploymenttype: 'AppDeployment'
versionidentifier: '2.0.1-B3'
timeout: 60
stagingmode: "nostage"
remote: "1"
upload: "1"
target:
- "%{hiera('package_clustername')}"
targettype:
- 'Cluster'
localpath: '/opt/releases/staging/applications/weblogic-pkg-1/weblogic-pkg-1-2.0.1-B3.war'
В файле YAML содержится около 50 пакетов, поэтому я не могу просто с сожалением сказать sed /version/newVersion. Система также довольно заблокирована, поэтому добавить в ОС парсер yaml может быть сложно.
Какие-нибудь советы?
Спасибо
Дейв
2 ответа
Наконец-то мне это удалось с помощью Perl. Я надеюсь, что это помогает кому-то еще:
#perl -000 -n -i -e "s/versionidentifier: '2.0.0-B1'/versionidentifier: '2.0.0-B3'/m if /\'weblogic-pkg-1\':/; print;" /opt/releases/staging/hiera/dev/deployments/node.corp.yaml
Для обновления каталога измените разделитель на @:
perl -000 -n -i -e "s@localpath: '/opt/releases/staging/applications/weblogic-pkg-1/weblogic-pkg-1-2.0.0-B1.war''@localpath: '/opt/releases/staging/applications/weblogic-pkg-1/weblogic-pkg-1-2.0.1-B2.war'@m if /\'vet-common-status-service\':/; print;" /opt/releases/staging/hiera/dev/deployments/node.corp.yaml
Я вижу, вы поняли это с perl
, Вот что я бы предложил:
perl -lape "if (/'weblogic-pkg-1':/../localpath:/ and /versionidentifier|localpath:/) {\$a = \$1 if /\s+versionidentifier: '(.+)'/;s/\$a/2.0.1-B3/}" input.txt
Если вы хотите обернуть его в скрипт Bash:
#!/usr/bin/env bash
while getopts ":p:v:" opt; do
case $opt in
p) p="$OPTARG"
;;
v) v="$OPTARG"
;;
\?) echo "Invalid option -$OPTARG" >&2
;;
esac
done
perl -lape "if (/'$p':/../localpath:/ and /versionidentifier|localpath:/) {\$a = \$1 if /\s+versionidentifier: '(.+)'/;s/\$a/$v/}" input.txt
Примечание: я не включил -i
переключаться, потому что это опасно: сначала вы должны поэкспериментировать и настроить скрипт под свои нужды, а затем заменить perl -i -lane
вместо perl -lane
,