Jill448
Jill448

Reputation: 1793

to grep a pattern from file compare contents with another file and replace

I want to grep version number in one file and replace it in another file. I want to grep 4.3.0.5 in file 1 and replace it in File 2 at 4.3.0.2. I have the below command to get the number , but how can I cut/replace it in second file??

File1 :
App :4.3.0.5 (or) App: 4.3.0.5-SNAPSHOT

File2: Before editing

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

File 2 : after editing (Desired Result:)

If $VERISON in File is WITHOUT the word SNAPSHOT then in file 2

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

If $VERSION has SNAPSHOT then line in file 2 should be

grid_application_distribution_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

Upvotes: 1

Views: 559

Answers (3)

anubhava
anubhava

Reputation: 784938

This awk script can do the job (this is an enhancement of above answer from @EDMorton):

Splitting the command in 2 as per OP's request

VER=$(awk -F' *: *' '/^App/{print $2}' file1)

awk -v v="$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

Upvotes: 0

fedorqui
fedorqui

Reputation: 289505

You can try with this:

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

it will look for "4.3.0.2" and change by value in $VERSION. File2 will be updated with this change.

If you want the file to keep the same, delete the flag -i:

sed "s/4.3.0.2/$VERSION/" File2

You will get the result in stdout.


As indicated in comments, 4.3.0.2 is not like this every time. Adapted for format X.Y.Z.W:

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

Upvotes: 0

Ed Morton
Ed Morton

Reputation: 203209

Something like this is all you need:

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

Upvotes: 2

Related Questions