Mr.Fireman
Mr.Fireman

Reputation: 554

How to append to a specific line using shell script?

I have a file (catalina.properties) with a specific line of:
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar"

In another environment it looks like this:
common.loader=

I would need a command which appends an extra part at the right side of the equal sign, and works in both of the 2 cases, so the result would be:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.base}/extra/part.jar"  

or in the other case:

common.loader="${catalina.base}/extra/part.jar"

Upvotes: 1

Views: 99

Answers (2)

RavinderSingh13
RavinderSingh13

Reputation: 133770

Could you please try following awk and let us know if this helps you. NON-ONE liner form of solution:

awk -v base="\${catalina.base}/lib" -v ja="\${catalina.base}/lib/*.jar" -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" -v s2="," '
/common.loader=$/{
  sub(/.*/,"&"s1 base s1 s2  s1 ja s1 s2 s1 extra_part s1);
  print;
  next
}
/common.loader=.*jar\"/{
  sub(/.*/,"&" s2 s1 extra_part s1);
  print;
  next
}
1
'   Input_file

One line form of solution:

awk  -v base="\${catalina.base}/lib" -v ja="\${catalina.base}/lib/*.jar" -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" -v s2="," '/common.loader=$/{sub(/.*/,"&"s1 base s1 s2 s1 ja s1 s2 s1 extra_part s1);print;next} /common.loader=.*jar\"/{sub(/.*/,"&" s2 s1 extra_part s1);print;next}1'  Input_file

Also as you need the Input_file itself to be edited, so you could add following code at the end of the above codes and could do the same

.... > tmp_file && mv tmp_file Input_file

EDIT1: If you want to add only extra part in either of the conditions then you could try following.

awk -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" '
/common.loader=/{
  s2=$0 ~ /=$/?"":",";
  sub(/.*/,"&" s2 s1 extra_part s1);
  print;
  next
}
1'   Input_file

Upvotes: 1

RomanPerekhrest
RomanPerekhrest

Reputation: 92904

sed solution:

exemplary test input file testfile:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar"
common.loader=
"ddd""sdsd"

sed 's~common\.loader=.*~&,"${catalina.base}/extra/part.jar"~; s/=,/=/' testfile

The output:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.base}/extra/part.jar"
common.loader="${catalina.base}/extra/part.jar"
"ddd""sdsd"

Upvotes: 3

Related Questions