Replace string with special characters value using sed in Ubuntu - shell

Following is the xml file in which STORAGE_ACCOUNT_KEY should be replaced with EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==
<property>
<name>fs.azure.account.key.storageaccountname.blob.core.windows.net</name>
<value>STORAGE_ACCOUNT_KEY</value>
</property>
I have tried the following. But nothing helps me solve it.
Using / after s and before g
sed -i "s/STORAGE_ACCOUNT_KEY/EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==/g" test.xml
Error:-
sed: -e expression #1, char 32: unknown option to `s'
Using | after s and before g
sed -i "s|STORAGE_ACCOUNT_KEY/EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==|g" test.xml
Error:-
sed: -e expression #1, char 112: unterminated `s' command
Note:- $STORAGE_ACCOUNT_KEY is a dynamic variable as below
sed -i "s|STORAGE_ACCOUNT_KEY/$STORAGE_ACCOUNT_KEY|g"

To replace XML, I would adivse to use an XML parser (for example xmllint) instead of sed.
That said, your sed expression is wrong.
sed s command uses 3 delimiters (any printable character you want), but these 3 must be the same and is defined by the one right after the s command.
s/foo/bar/g # right
s|foo|bar|g # right
s|foo/bar|g # wrong
Since you replace a string with a base64 string, you should not use any of the base64 character, so don't use / as a sed delimiter in that case.
Your expression should be like this:
sed -i "s|STORAGE_ACCOUNT_KEY|EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==|g" test.xml
Note that the g modifier at the end of the command might not be necessary if you only have 1 string to replace per line.

Related

How to use sed command to replace folder path names in linux?

How to replace folder path using following command,
sed -i "s/# pidfile: '/var/run/jboss-eap/jboss-eap.pid /# pidfile: '/var/run/jboss-eap/jboss-eap-aa.pid' /g" ks
Error: sed: -e expression #1, char 20: unknown option to `s'
When I use sed -i "s/sample/hi/g" sam.txt It working fine , but above mentioned expression throws unknown exception. How to resolve this error ? have any idea ?
You need to change the delimiter (/) in your statement, as it is also in your pattern.
sed -i "s## pidfile: '/var/run/jboss-eap/jboss-eap.pid ## pidfile: '/var/run/jboss-eap/jboss-eap-aa.pid' #g" ks
Here I replaced it wiht #, but you can use any delimiter, as long as it's not part of the pattern text.

Unix Remove all occurences of character and save

How to remove all occurences of string "???" of a file and save it?
My approach so far:
cat file.txt | sed -ie '/s/???//' file.txt
However I get the following error:
sed: -e expression #1, char 4: unknown command: `?'
You can use this sed command:
sed -i 's/???//g' file.txt
There is no reason to use cat here as sed can directly operate on a file and save it in-line.
Also note that unlike other regex flavors BRE (Basic Regular Expressions) which is default regex engine of sed doesn't treat ? as a special regex meta character hence there is no need to escape ? here.

Replace a variable with text (sed)

I have to find a specific text in the file and then replace that text with some new text.
The contents of the file are:
host=100
servers=4
clients=70
I have tried this:
var=$(grep "servers=" /path/to/file)
sed -i "s/${var}/servers=5/g" /path/to/file
But it gives me the error:
sed: -e expression #1, char 2: unterminated `s' command
Note: All I want is to update the value of each of the variable i.e. servers=4 should be replaced by servers=5.
Please help me figure out the solution.
Thanks.
The output of grep ends with a newline character. sed expects the whole command on one line or escaping line breaks.
However, you can easily achieve the complete task with sed only:
sed -i 's/^servers=[0-9]*$/servers=5/' /path/to/file
sed -i.bak "s/servers=[0-9]*/servers=5/" /path/to/file

Find and Replace string using sed gives error

I am using shell script. My requirement is to find and replace the string. The string contains "/" char as well. I am getting error sed: -e expression #1, char 18: unterminated `s' command. Can someone tell how should i replace the string which has "/"?
#!/bin/bash
...
search_string="../conf/TestSystem/Inst1.xml"
rep="Inst1/Instrument.xml"
sed -i 's|${line}|${rep}/g' MasterConfiguration.xml
I tried using another sed command but that one also gave error sed: -e expression #1, char 13: unknown option to `s'
sed -e "s/${line}/${rep}/g" MasterConfiguration.xml > tempfile
Whenever you deal with shell-variables you have to get them out of the "sed-string":
For example:
sed -e "s/"${line}"/"${rep}"/g" MasterConfiguration.xml > tempfile
Otherwise sed will treat the chars as-is and search for ${line} literally:
As you see, nothing happens here.
Furthermore, if your variables contain / you need to use another delimiter for sed. I tend to use ~ in such a case, but you're free to use other chars - just be consequent and don't mix them like in your first example-sed-command:
sed 's~'${line}'~'${rep}'/g' //WRONG
sed 's~'${line}'~'${rep}'~g' //RIGHT
Combine both and it will work:
You can try this sed,
sed -i "s#${line}#${rep}#g" MasterConfiguration.xml
Problem:
Instead you have,
sed -i "s|${line}|${rep}/g" MasterConfiguration.xml
It should be,
sed -i "s|${line}|${rep}|g" MasterConfiguration.xml
Syntax:
sed "s|pattern|replacement|g"

replace double quoted hash with sed

I have a problem replacing default password hash in config file:
sed -i 's/default_password_crypted: "[^"]*"/default_password_crypted: "\$1\$mF86/UHC\$WvcIcXred6crBz2onWxyac."/' input.txt
i get following error:
sed: -e expression #1, char 74: unknown option to `s'
works:
search pattern: default_password_crypted: "$1$mF86/UHC$WvcIcX2t6crBz2onWxyac."
sed -i 's/default_password_crypted: "[^"]*"/default_password_crypted: "1234567890"/' input.txt
how do i need to write replace pattern for hash ?
thx
You need to escape the literal / inside your replacement as it’s the delimiter:
sed -i 's/default_password_crypted: "[^"]*"/default_password_crypted: "\$1\$mF86\/UHC\$WvcIcXred6crBz2onWxyac."/' input.txt
Or simply use a different character, for example a ,:
sed -i 's,default_password_crypted: "[^"]*",default_password_crypted: "\$1\$mF86,UHC\$WvcIcXred6crBz2onWxyac.",' input.txt
You also don’t need to escape the $ inside the replacement.

Resources