Bash - Ersetzungsparameter in der übergeordneten Übereinstimmung (SED / AWK)

402
ds2000

Ich arbeite an einem kleinen Skript, um einige Variablen, packageName, newVersion, zu übernehmen. Ich habe gegoogelt und eine ganze Menge ausprobiert und das bringt mich zum Nachfragen.

Das Skript wird ausgeführt als: updatePackage.sh -p weblogic-pkg-1 -v 2.0.1-B3

Dies liest yaml:

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

Ich versuche, das Skript dazu zu bringen, die Versionsnummer zu ändern, sobald es mit dem Paket übereinstimmt. Die gewünschte Ausgabe lautet also:

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

Die YAML-Datei hat etwa 50 Pakete, daher kann ich leider nicht einfach sed / version / newVersion. Das System ist auch ziemlich gesperrt, so dass das Hinzufügen eines Yaml-Parsers zum Betriebssystem möglicherweise schwierig ist.

Irgendwelche Tipps?

Vielen Dank

Dave

1
Vielleicht ist die Frage für Sie selbstverständlich, Sie sollten jedoch weitere Details hinzufügen. Was genau willst du damit erreichen? Ich nehme an, was Sie gepostet haben, um die Originaldatei zu sein. Wenn ja, dann posten Sie die Datei so, wie sie von `sed` oder` awk 'geändert werden soll. Stellen Sie auch die von Ihnen verwendeten Befehle bereit, damit andere vorschlagen können, wie Sie sie beheben können. simlev vor 7 Jahren 0
Danke für die Antwort. Ich habe die ursprüngliche Frage so aktualisiert, dass sie hoffentlich etwas verständlicher ist :) ds2000 vor 7 Jahren 0

2 Antworten auf die Frage

0
ds2000

Zum Schluss habe ich es mit perl geschafft. Ich hoffe, das hilft jemand anderem:

#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 

Ändern Sie für das Verzeichnis-Update das Trennzeichen in ein @:

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

Ich sehe, du hast den Dreh raus perl. Das hätte ich vorgeschlagen:

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

Wenn Sie es in ein Bash-Skript einschließen möchten:

#!/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 

Hinweis: Ich habe den -iSchalter nicht hinzugefügt, weil er gefährlich ist: Sie sollten zunächst das Skript ausprobieren und an Ihre Bedürfnisse anpassen und erst dann perl -i -laneanstelle von ersetzen perl -lane.