0

I have a config file which I use to store key values which is then over written on actual properties file. I have below code which I use for this purpose and this works fine for key values which does not have '&' in it.

Get the desired value from the config file:

postgresql_url=$(grep "^postgresql.url=" ./<file_name> |cut -d= -f2,3,4,5)

the above code gives me:

jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require

I am trying to over write the below value with the one from above

app1.postgresql.url=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=require

sed: however gives me this output after replacing:

sed -i -e '/postgresql.url[[:blank:]]*=/ s|=.*|='$postgresql_url'|' $property_file

Result:

app1.postgresql.url=jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=requireuser=user1=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=requiresslmode=require

As you can see the replace it not what is required. How to ignore '&' in sed replacement and get below result:

app1.postgresql.url=jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require
VN-
  • 27
  • 6

1 Answers1

0

How about escaping & (a.k.a adding \ before each &) in the replacement string for sed?

A bit explanation about escaping special characters inside a variable using sed can be found here.


Here is a sample script for your case:

#!/bin/bash

mkdir temp && cd temp

# Create the property file (in which url needs to be replaced)
echo 'app1.postgresql.url=jdbc:postgresql://ec2-11-111-1-139.eu-west-1.compute.amazonaws.com:222/d53hyyyy928s0?password=abc&user=user1&sslmode=require' >> property


# The new url
postgresql_url='jdbc:postgresql://ec2-22-222-2-22.eu-central-1.compute.amazonaws.com:111/d3bxxxx2cj1?password=xyz&user=user1&sslmode=require'

# Escape &
postgresql_url=$(echo "${postgresql_url}" | sed -r 's/[&]/\\&/g')


# For sed
pattern='app1\.postgresql\.url=.*$'
replacement="app1.postgresql.url=${postgresql_url}"

# Replace
sed -i -r "s;${pattern};${replacement};g" property
Vinay Vissh
  • 457
  • 2
  • 9
  • 12