user2275908
user2275908

Reputation: 157

Sed replace text

I need to replace text with single quotes with sed and I can't get it to work. Here is my code; can you help me?

I have a text file with this format:

#sometext
$configuration_TEstbk2_bk2_environment12 = 'lalala'
$configuration_TEstbk2_bk2_envoronment12 = 'lalala1'
$configuration_TEstbk2_bk2_staging12 = 'BACKUP 2'
$configuration_waq4faw4f_q4fq4qg4f = 'r234rq43rq4rqr'
$configuration_alice_StagingTEstBk_bk = 'testebk'
$configuration_deployment_overlays_alice_TEStStngDir = 'some'
$configuration_arefgqrqgrq_341q34tq34t = '134t135'

And I need to do something like:

sed s/$configuration_arefgqrqgrq_341q34tq34t   ='134t135'/$configuration_arefgqrqgrq_341q34tq34t = 'NEWVALUE'/g 

I have tried with many combinations with sed but I can't find one that works.

Upvotes: 0

Views: 714

Answers (5)

potong
potong

Reputation: 58568

This might work for you (GNU sed):

sed -r 's/^(\$\S+\s=\s'\'').*('\'')/\1NEWVALUE\2/' file

Upvotes: 0

perreal
perreal

Reputation: 98118

You can also totally avoid matching quotes by capturing them:

sed '/$configuration_arefgqrqgrq_341q34tq34t/{
         s/\(= *.\).*\(.\) *$/\1NEWVALUE\2/
}' input

Upvotes: 0

Lev Levitsky
Lev Levitsky

Reputation: 65851

Would this work for you?

sed "/\$config_deployment_overlays_alice_arefgqrqgrq_341q34tq34t_staging/s/'134t135'/'NEWVALUE'/" file

Upvotes: 1

tripleee
tripleee

Reputation: 189908

I suppose your problem is with the quoting. You could use complex quoting to make sure everything is in single quotes, except the single quotes which need to be in double quotes:

sed 's/$configuration_arefgqrqgrq_341q34tq34t *= *'"'134t135'"'/$configuration_arefgqrqgrq_341q34tq34t = '"'NEWVALUE'/g"

... or you could use some temporary variables to make the whole thing more readable, and suitable for inclusion in a single pair of double quotes:

directive='$configuration_arefgqrqgrq_341q34tq34t'
oldvalue="'134t135'"
newvalue="'NEWVALUE'"
sed "s/$directive *= *$oldvalue/$directive = $newvalue/g"

(If you only expect one match, the /g flag is superfluous.)

Upvotes: 0

Jonathan Leffler
Jonathan Leffler

Reputation: 755026

I'd probably use:

sed '/$configuration_arefgqrqgrq_341q34tq34t *=/'"s/'134t135'/'NEWVALUE'/"

This uses a mix of single quotes and double quotes at the shell level to get the correct information to sed. The single quotes enclose the search condition for the lines containing $configuration_arefgqrqgrq_341q34tq34t followed by some blanks and an equals sign. This avoids the shell expanding what might be a shell variable name (but probably isn't, so the empty string would be substituted). I then switch to double quotes at the shell level, so that sed gets to see the single quotes: it substitutes the value in single quotes with the replacement value, but only on those lines that contain the given configuration parameter name.

I hope users never have to type those configuration parameter names.

Upvotes: 0

Related Questions