I want to replace this line #discovery.seed_hosts: ["host1","host2"]
with discovery.seed_hosts: ["${extraNode1}","${extraNode2}","${masterIP}"]
. Need to remove the #
and replace the host1 and host2 as per the given argument also need to add another value (3rd value) into the array as well.
sudo sed -i "/#discovery.seed_hosts: ["host1","host2"]/s/#discovery.seed_hosts: ["host1","host2"]/discovery.seed_hosts: ["${extraNode1}","${extraNode2}","${masterIP}"]/" check.yml
I tried the above command to do this but it is giving error because of the ["host1","host2"]
in the command.
sed: -e expression #1, char 49: Invalid range end
- Error received
CodePudding user response:
You need to use the s
(substitute) command, and escape .
, in addition to [
. Like this:
sudo sed -i 's/#\(discovery\.seed_hosts: \["\)host1","host2"]/\1${extraNode1}","${extraNode2}","${masterIP}"]/' check.yml
If you don't scape the .
, the sed
command will match any character where the .
is, like #discovery7seed_hosts: ["host1","host2"]
.
The sed
command is pretty straight forward. I just added parentheses around the part of the match that I wanted to reuse in the substitution which creates a group. The \1
is replace with "group 1", the contents of what's in between the parentheses, which must be escaped too.
EDIT: The "
, double quotes, don't need to be escaped because the sed
command is in single quotes: 's/.../.../'
. Also, the ]
, closing square bracket, doesn't need to be escaped as long as its corresponding [
, opening square bracket, has been escaped. Finally, both parentheses (
and )
need to be escaped to create the group. (END OF EDIT)
Test:
$ cat check.yml
This is a test
Another line
#discovery.seed_hosts: ["host1","host2"]
#discovery7seed_hosts: ["host1","host2"]
OK. Good bye?
$ sed 's/#\(discovery\.seed_hosts: \["\)host1","host2"]/\1${extraNode1}","${extraNode2}","${masterIP}"]/' check.yml
This is a test
Another line
discovery.seed_hosts: ["${extraNode1}","${extraNode2}","${masterIP}"]
#discovery7seed_hosts: ["host1","host2"]
OK. Good bye?
$
CodePudding user response:
You'll need to escape [
s and "
s with backslashes as:
sudo sed -i "/#discovery.seed_hosts: \[\"host1\",\"host2\"]/s/#discovery.seed_hosts: \[\"host1\",\"host2\"]/discovery.seed_hosts: [\""${extraNode1}\"",\""${extraNode2}\"",\""${masterIP}\""]/" check.yml