76

With Bash and SED I'm trying to replace two strings in a js file with URL's.

The two urls that should be inserted is input params when I run the .sh script.

./deploy.sh https://hostname.com/a/index.html https://hostname2.com/test 

However to make this usable in my sed command I have to escape all forward slashes with: \\ ?

./deploy.sh https:\\/\\/hostname.com\\/a\\/index.html https:\\/\\/hostname2.com\\/test 

If they are escaped this SED command works on Mac OSX Sierra

APP_URL=$1 API_URL=$2 sed "s/tempAppUrl/$APP_URL/g;s/tempApiUrl/$API_URL/g" index.src.js > index.js 

Now I don't want to insert escaped urls as params, I want the script it self to escape the forward slashes.

This is what I've tried:

APP_URL=$1 API_URL=$2 ESC_APP_URL=(${APP_URL//\//'\\/'}) ESC_API_URL=(${API_URL//\//'\\/'}) echo 'Escaped URLS' echo $ESC_APP_URL #Echos result: https:\\/\\/hostname.com\\/a\\/index.html echo $ESC_API_URL #Echos result: https:\\/\\/hostname2.com\\/test echo "Inserting app-URL and api-URL before dist" sed "s/tempAppUrl/$ESC_APP_URL/g;s/tempApiUrl/$ESC_API_URL/g" index.src.js > index.js 

The params looks the same but in this case the SED throws a error

sed: 1: "s/tempAppUrl/https:\\/\ ...": bad flag in substitute command: '\' 

Could anyone tell me the difference here? The Strings looks the same but gives different results.

1
  • It's not just the /s, there's a LOT more characters you have to escape (e.g. the .s in your current regexp) but sed won't give you an error message for most of them, it'll just corrupt your output. See stackoverflow.com/questions/29613304/…. If you want to learn how to do a robust string substitution then post a new question (and the answer will not be sed since sed does not support strings!). Commented Nov 21, 2016 at 14:13

1 Answer 1

195

I suggest to replace

sed "s/regex/replace/" file 

with

sed "s|regex|replace|" file 

if your sed supports it. Then it is no longer necessary to escape the slashes.

The character directly after the s determines which character is the separator, which must appear three times in the s command.

Sign up to request clarification or add additional context in comments.

4 Comments

Hmm, The SED passed but with wrong result. https:\/\/hostname.com\/a\/index.html
If your sed supports it? Isn't that a feature of any sed since the epoch?
When using | as separator, you don't need to escape the slashes. Your ESC_APP_URL=(${APP_URL//\//'\\/'}) lines are completely unnecessary and wrong.
"If your sed supports it"? Which sed's do not? I have seen the differences in -i '' on mac vs Linux, but this seems to be a regex syntax adopted by more languages/applications, like perl. Can's seem to find much docs about the variant. But in both perl and sed it works on my mac (10.13). So thanks.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.