Bash - substituindo o parâmetro na correspondência pai (SED / AWK)

1

Estou trabalhando em um script pequeno para pegar algumas variáveis, packageName, newVersion. Eu pesquisei e tentei muito e isso me leva a perguntar.

O script é executado como: updatePackage.sh -p weblogic-pkg-1 -v 2.0.1-B3

Isso lê yaml:

## 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'

Estou tentando fazer com que o script altere o número da versão depois de corresponder ao pacote, portanto a saída desejada é:

## 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'

O arquivo YAML tem cerca de 50 pacotes, então não posso apenas sed / version / newVersion, infelizmente. O sistema também é bastante bloqueado, portanto, adicionar um analisador yaml ao sistema operacional pode ser complicado.

Alguma dica?

Obrigado

Dave

    
por ds2000 12.06.2017 / 15:13

2 respostas

0

Finalmente, eu consegui com perl. Espero que isso ajude alguém:

#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

Para a atualização do diretório, altere o delimitador para um @:

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
    
por 14.06.2017 / 15:07
0

Eu vejo que você pegou o jeito com perl . Isso é o que eu teria sugerido:

perl -lape "if (/'weblogic-pkg-1':/../localpath:/ and /versionidentifier|localpath:/) {\$a = \ if /\s+versionidentifier: '(.+)'/;s/\$a/2.0.1-B3/}" input.txt

Se você quiser envolvê-lo em um script 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 = \ if /\s+versionidentifier: '(.+)'/;s/\$a/$v/}" input.txt

Observação: não incluí a opção -i porque é perigosa: primeiro experimente e adapte o script às suas necessidades e só então substitua perl -i -lane em vez de perl -lane .

    
por 14.06.2017 / 15:17