web-dev-qa-db-fra.com

Échapper aux barres obliques dans la commande sed

Avec Bash et SED j'essaie de remplacer deux chaînes dans un fichier js par des URL.

Les deux URL à insérer sont des paramètres d'entrée lorsque j'exécute le script .sh.

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

Cependant, pour rendre cela utilisable dans ma commande sed, je dois échapper à toutes les barres obliques avec: \\?

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

S'ils sont échappés, cette commande SED fonctionne sur 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

Maintenant, je ne veux pas insérer d'URL échappées en tant que paramètres, je veux que le script lui-même échappe aux barres obliques.

Voici ce que j'ai essayé:

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

Les paramètres sont identiques, mais dans ce cas, le SED génère une erreur

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

Quelqu'un pourrait-il me dire la différence ici? Les cordes se ressemblent mais donnent des résultats différents.

28
Jonathan Andersson

Je propose de remplacer

sed "s/regex/replace/" file

avec

sed "s|regex|replace|" file

si votre sed le supporte. Ensuite, il n'est plus nécessaire d'échapper aux barres obliques.

Le caractère situé juste après le s détermine quel caractère est le séparateur, qui doit apparaître trois fois dans la commande s.

60
Cyrus