2016-11-21 4 views
9

Bash और SED के साथ आगे की स्लैश से बचने के लिए मैं URL के साथ एक जेएस फ़ाइल में दो तारों को प्रतिस्थापित करने की कोशिश कर रहा हूं।sed कमांड

दो यूआरएल जो डाला जाना चाहिए इनपुट एसएएम जब मैं .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 

वे मैक OSX सिएरा पर भाग निकले कर रहे हैं इस SED आदेश काम करता है

APP_URL=$1 
API_URL=$2 

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

अब अगर मैं पैरामीटर के रूप में बच गए यूआरएल डालने के लिए नहीं करना चाहते, मैं स्क्रिप्ट यह आत्म फ़ॉरवर्ड स्लैश बचना चाहते हैं ।

यह मैं क्या कोशिश की है है:

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 

पैरामीटर ही लेकिन इस मामले में एसईडी एक त्रुटि

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

किसी को भी मुझे फर्क यहां बता सकते हैं फेंकता लग रहा है? स्ट्रिंग्स एक जैसा दिखता है लेकिन अलग-अलग परिणाम देता है।

+0

यह सिर्फ '/' s नहीं है, आपके पास बचने के लिए बहुत अधिक वर्ण हैं (उदाहरण के लिए 'वर्तमान में regexp में'। 'लेकिन sed उनमें से अधिकांश के लिए आपको एक त्रुटि संदेश नहीं देगा, यह' बस आपके आउटपुट को दूषित कर देगा। Http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460 देखें। यदि आप सीखना चाहते हैं कि एक मजबूत स्ट्रिंग प्रतिस्थापन कैसे करें, तो एक नया प्रश्न पोस्ट करें (और उत्तर नहीं होगा क्योंकि sed seding का समर्थन नहीं करता है!)। –

उत्तर

14

मैं

sed "s|regex|replace|" file 

साथ

sed "s/regex/replace/" file 

को बदलने के लिए सलाह है कि आपके sed यह समर्थन करता है तो। फिर स्लेश से बचने के लिए अब आवश्यक नहीं है।

+0

हम्म, एसईडी पास हो गया लेकिन गलत परिणाम के साथ। https: \/\/hostname.com \/a \ /index.html –

+3

यदि आपका sed इसका समर्थन करता है? क्या यह युग के बाद से किसी भी sed की विशेषता नहीं है? – Jens

+2

'|' को विभाजक के रूप में उपयोग करते समय, आपको स्लेश से बचने की आवश्यकता नहीं है। आपका 'ESC_APP_URL = ($ {APP_URL // \ // '\\ /'}) 'रेखाएं पूरी तरह से अनावश्यक और गलत हैं। –