web-dev-qa-db-ja.com

sedコマンドでのスラッシュのエスケープ

BashSEDで、jsファイル内の2つの文字列をURLに置き換えようとしています。

挿入する必要がある2つのURLは、.shスクリプトを実行するときの入力パラメーターです。

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

しかし、これをsedコマンドで使用可能にするには、すべてのスラッシュをエスケープする必要があります:\\

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

エスケープされている場合、このSEDコマンドは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

これで、エスケープされたURLをパラメーターとして挿入したくないので、スクリプト自体がスラッシュをエスケープするようにします。

これは私が試したものです:

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

Paramsは同じように見えますが、この場合、SEDはエラーをスローします

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

ここの違いを教えてもらえますか?文字列は同じように見えますが、結果は異なります。

28

交換することをお勧めします

sed "s/regex/replace/" file

sed "s|regex|replace|" file

sedがサポートしている場合。その後、スラッシュをエスケープする必要はなくなりました。

sの直後の文字は、どの文字がセパレーターであるかを決定します。これは、sコマンドで3回出現する必要があります。

60
Cyrus