2016-11-21 60 views
9

Z Bash i SED Próbuję zastąpić dwa ciągi w pliku js adresami URL.Uciekające ukośniki w poleceniu sed

Dwa adresy URL, które należy wstawić, to parametry wejściowe po uruchomieniu skryptu .sh.

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

Jednak aby ten użyteczny w moim sed polecenia muszę uciec wszystkie ukośniki z: \\?

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

Jeśli są to uciekł sed polecenie działa na 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 

Teraz nie chcę wstawić uciekły adresy URL jako params, chcę skrypt to samo ucieczki ukośniki .

To co próbowałem:

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 wygląda tak samo, ale w tym przypadku LEP wyrzuca błąd

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

Czy ktoś może mi powiedzieć różnicę tutaj? Struny wyglądają tak samo, ale dają różne wyniki.

+0

To nie tylko '/' s, jest dużo więcej znaków, które musisz uciec (np. '' 'W twoim bieżącym regexp), ale sed nie da ci komunikatu o błędzie dla większości z nich, to ' Po prostu uszkodzę twoje wyniki. Zobacz http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460. Jeśli chcesz dowiedzieć się, jak wykonać solidne podstawianie ciągów znaków, opublikuj nowe pytanie (a odpowiedź nie będzie sed, ponieważ sed nie obsługuje ciągów!). –

Odpowiedz

14

Proponuję zastąpić

sed "s/regex/replace/" file 

z

sed "s|regex|replace|" file 

jeśli sed ją obsługuje. Wtedy nie ma już potrzeby ucieczki od ukośników.

+0

Hmm, test SED został przyjęty, ale z błędnym wynikiem. https: \/\/nazwa_hosta.com \/a \/index.html –

+3

Jeśli twój sed obsługuje to? Czy to nie jest cecha sed od epoki? – Jens

+2

Używając '|' jako separatora, nie musisz uciekać z ukośników. Twoje linie 'ESC_APP_URL = ($ {APP_URL // \ // '\\ /'}) są całkowicie niepotrzebne i błędne. –