pour grep un motif à partir d’un fichier, comparer le contenu avec un autre fichier et le remplacer

Je veux grep le numéro de version dans un fichier et le remplacer dans un autre fichier. Je veux grep 4.3.0.5 dans le fichier 1 et le remplacer dans le fichier 2 à la version 4.3.0.2. J’ai la commande ci-dessous pour obtenir le numéro, mais comment puis-je le couper / remplacer dans le deuxième fichier?

Fichier1:
App: 4.3.0.5 (ou) App: 4.3.0.5-SNAPSHOT

Fichier2: Avant de modifier

grid_application_dissortingbution_url = nexus : //com.abcd.efge.ce/App/ 4.3.0.2 /tar.gz/config

Fichier 2 : après édition ( résultat souhaité:)

Si $ VERISON dans le fichier est SANS le mot SNAPSHOT alors dans le fichier 2

grid_application_dissortingbution_url = nexus : //com.abcd.efge.ce/App/ 4.3.0.5 /tar.gz/config

Si $ VERSION a SNAPSHOT, alors la ligne dans le fichier 2 devrait être

grid_application_dissortingbution_url = nexus-snapshot : //com.abcd.efge.ce/App/ 4.3.0.5 /tar.gz/config

VER=$(awk -F: '/^App/{sub(/ .*$/, "", $2); print $2}'/path/file1.txt) echo $VER if ($vER ~ /SNAPSHOT/) /usr/bin/ssh -t -t server2.com "sub("=nexus:", ":=nexus-snapshot") /path/file2" && sub(/[^\/]+\/tar\.gz/, $VER"/tar.gz") /path/file2 

Ce script awk peut faire le travail (ceci est une amélioration de la réponse ci-dessus de @EDMorton):

Fractionnement de la commande en 2 selon la requête de l’OP

 VER=$(awk -F' *: *' '/^App/{print $2}' file1) awk -vv="$VER" '{ split(v, arr, "-"); sub(/[^\/]+\/tar\.gz/, arr[1]"/tar.gz"); if (arr[2] ~ /SNAPSHOT/) sub("=nexus:", ":=nexus-snapshot") }1' file2 > tmpFile mv tmpFile > file2 

Quelque chose comme ça est tout ce dont vous avez besoin:

 awk -F': +' 'NR==FNR{v=$2;next} {sub(/[^/]+\/tar.gz/,v"/tar.gz")} 1' File1 File2 > tmp && mv tmp File2 

Vous pouvez essayer avec ceci:

 VERSION=($(grep -r "App:" /path/File1| awk '{print ($2)}')) sed -i "s/4.3.0.2/$VERSION/" File2 

il cherchera “4.3.0.2” et changera par valeur dans $VERSION . File2 sera mis à jour avec ce changement.

Si vous souhaitez que le fichier rest identique, supprimez le drapeau -i :

 sed "s/4.3.0.2/$VERSION/" File2 

Vous obtiendrez le résultat dans stdout.


Comme indiqué dans les commentaires, 4.3.0.2 n’est pas comme ça à chaque fois. Adapté pour le format XYZW :

 sed "s/\/[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]\(\/tar.gz\)/\/$VERSION\1/" File2