2016-11-21 8 views
9

BashSED jsファイルの2つの文字列をURLに置き換えようとしています。sedコマンドでスラッシュをエスケープする

挿入する必要がある2つのURLは、.shスクリプトを実行するときに入力パラメータです。私はすべての楽しみをエスケープする必要がしかし、私のsedコマンドでこれを使用可能にする

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

はとスラッシュ:\\?彼らは

APP_URL=$1 
API_URL=$2 

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

今マックOSXシエラに、このsedコマンドの作品を​​エスケープしている場合

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

私はそれが自己スラッシュをエスケープするスクリプトをしたい、のparamsのようにエスケープ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: '\' 

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

+0

これは '/' sだけではなく、あなたがエスケープしなければならない文字がたくさんあります(例えば現在のregexpの '.'s)。しかしsedは大部分のエラーメッセージを表示しません。ちょうどあなたの出力を壊すでしょう。 http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460を参照してください。堅牢な文字列置換を行う方法を学びたい場合は、新しい質問を投稿してください(そして、sedは文字列をサポートしていないため、答えはsedされません)。 –

答えて

14

私はあなたのsedがそれをサポートしている場合

sed "s|regex|replace|" file 

sed "s/regex/replace/" file 

を交換することをお勧めします。それから、もはやスラッシュをエスケープする必要はありません。

+0

ええと、SEDは合格しましたが、間違った結果が出ました。 https:\/\/hostname.com \/a \ /index.html –

+3

あなたのsedがサポートしていれば?その時代以来のsedの特徴ではありませんか? – Jens

+2

セパレータとして '| 'を使用する場合、スラッシュをエスケープする必要はありません。あなたの 'ESC_APP_URL =($ {APP_URL // \/'\\ /'})'行は完全に不要で間違っています。 –

関連する問題