Suppose I have a file called mytest.conf which looks like:
displayName: REPLACE_ONE
url: "https://REPLACE_TWO:8443"
The goal is to invoke a sed command and replace "REPLACE_ONE" with "one" and "REPLACE_TWO" with "two".
Desired output of mytest.conf is:
displayName: one
url: "https://two:8443"
When I run:
find . -type f -name "*.conf" -exec sed -i'' -e 's/REPLACE_TWO./two/g' {} +
mytest.conf gets modified to look like:
displayName: one
url: "https://two8443"
which is really close, but for some reason the colon ":" gets deleted.
When I run:
find . -type f -name "*.conf" -exec sed -i'' -e 's/REPLACE_ONE./one/g' {} +
nothing happens to mytest.conf (ie the REPLACE_ONE is still there.) and I'm not sure why.
Would appreciate it if someone in the community could help me debug my sed statements.
.
matches any character, so you are also matching an additional character after the literal search. As there is nothing after REPACE_ONE
, no match is made, hence, no substitution.
To achieve your output, you can chain together both substitutions
$ find . -type f -name "*.conf" -exec sed -i'' 's/REPLACE_ONE/one/;s/REPLACE_TWO/two/' {} \;
Take your dots out.. That is indicating one character AFTER your search string:
find . -type f -name "*.conf" -exec sed -i'' -e 's/REPLACE_ONE/one/g' {} +
find . -type f -name "*.conf" -exec sed -i'' -e 's/REPLACE_TWO/two/g' {} +
This can be simplified into a single line as well..
find . -type f -name "*.conf" -exec sed -i'' -e 's/REPLACE_TWO/two/g;s/REPLACE_ONE/one/g' {} +
The reason that doesn't work for ONE
is that there is nothing after it but a newline
. So the search comes back false. Had you a space or a character after REPLACE_ONE
it would remove that character because of the dot.
The reason it removes the colon on TWO
is because the dot is signifying a character afterward, which is your colon.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.