Bash - подстановочный параметр в родительском совпадении (SED / AWK)

325
ds2000

Я работаю над небольшим скриптом, чтобы взять некоторые переменные, 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: - "%" 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: - "%" targettype: - 'Cluster' localpath: '/opt/releases/staging/applications/weblogic-pkg-1/weblogic-pkg-1-2.0.1-B3.war' 

В файле YAML содержится около 50 пакетов, поэтому я не могу просто с сожалением сказать о sed / version / newVersion. Система также довольно заблокирована, поэтому добавить в ОС парсер yaml может быть сложно.

Какие-нибудь советы?

Спасибо

Дейв

1
Может быть, вопрос очевиден для вас, но вы должны добавить больше деталей. Что именно вы пытаетесь достичь? Я принимаю то, что вы опубликовали, за оригинальный файл, если это так, то, пожалуйста, опубликуйте файл так, как вы хотите, чтобы он был изменен с помощью `sed` или` awk`. Также опубликуйте команды, которые вы использовали, чтобы другие могли предложить, как их исправить. simlev 7 лет назад 0
Спасибо за ответ. Я обновил исходный вопрос, чтобы, надеюсь, он стал немного понятнее :) ds2000 7 лет назад 0

2 ответа на вопрос

0
ds2000

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

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