1

Я работаю над небольшим скриптом, чтобы взять некоторые переменные, 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 ответа2

0

Наконец-то мне это удалось с помощью 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
0

Я вижу, вы поняли это с 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .