बाश में एक स्ट्रिंग से बचने के लिए आदेश


99

मुझे एक bash कमांड की आवश्यकता है जो एक स्ट्रिंग को किसी ऐसी चीज में बदल देगा जो बच गई है। यहाँ एक उदाहरण है:

echo "hello\world" | escape | someprog

जहां भागने की आज्ञा देता "hello\world"है "hello\\\world"। फिर, someprog उपयोग कर सकते हैं के "hello\\world"रूप में यह उम्मीद है। बेशक, यह एक सरल उदाहरण है कि मैं वास्तव में क्या कर रहा हूं।


5
पलायन का स्वरूप क्या है? दूसरे शब्दों में, किन वर्णों से बचने की आवश्यकता है? क्या आप एक C ++ - स्टाइल एस्केप (जहाँ टैब को \ n, \ n के साथ नए सिरे से प्रतिस्थापित किया जाता है, आदि \
_


इस सवाल का मतलब एक दर्जन अलग-अलग चीजों से हो सकता है। हमें यह अनुमान लगाने के बजाय, यह जानने में मदद करेगा कि आप वास्तव में किस तरह के पलायन की तलाश कर रहे हैं।
डॉन हैच

1
प्रश्न \\ का उपयोग करने के लिए विशिष्ट था। एक स्वीकृत उत्तर है।
उपयोगकर्ता

जवाबों:


155

बैश में:

printf "%q" "hello\world" | someprog

उदाहरण के लिए:

printf "%q" "hello\world"
hello\\world

इसका उपयोग चर के माध्यम से भी किया जा सकता है:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
माइंड यू, %qलगभग 2012 तक एक दशक से अधिक समय तक टूट गया था। इसके साथ समस्याएं थीं ~। वहाँ भी पोर्टेबल एसईडी एक-लाइनर्स stackoverflow.com/a/20053121/1073695
Jo तो

1
सीड वास्तव में बेहतर है क्योंकि डॉलर के संकेतों से भी बच सकते हैं
अनकहा करें

2
@untore: (डॉलर चिह्न बच जाता है) a='abc$def":'; printf '%q\n' "$a"में परिणाम abc\$def\":। यह बैश 4.3 है (मुझे बैश 3.2 में भी यही परिणाम मिला है)। आप कौन सा संस्करण उपयोग कर रहे हैं?
अगली सूचना तक रोक दिया गया।

3
डॉलर के चिह्न से बचने के लिए केवल एकल उद्धरणों का उपयोग करें, जैसे:printf "%q" 'he$l&lo\world'
LeandroCR

बैश के printf '%q\n' textपाठ को bashप्रारूप (और वर्तमान स्थान के लिए) में someprogउद्धृत करता है , इसलिए यह केवल ओपी के मामले में काम करेगा यदि उनके पास ठीक उसी उद्धृत वाक्यविन्यास है bashजो अत्यधिक संभावना नहीं है।
स्टीफन चेज़लस

9

शुद्ध बैश, पैरामीटर प्रतिस्थापन का उपयोग करें:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
इस तरह से "हैलो वर्ल्ड" "हेल्लो \ वर्ल्ड" से बच नहीं जाता है - स्वीकार किए गए उत्तर में प्रिंटफ aproach करता है।
21

1
इसके अलावा, "03/25/2017" के अनुसार "% q" नहीं बचता / '' जिसे मुझे "03 \ / 25 \ / 2017" से बचने की आवश्यकता थी (ताकि यह नियमित रूप से '' सीमांकित '' हो सके। अभिव्यक्ति)।
wrlee

0

उदाहरण के लिए, आप विभिन्न वर्णों को बदलने के लिए पर्ल का उपयोग कर सकते हैं:

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

आपके भागने की प्रकृति के आधार पर, आप उचित वर्णों से बचने के लिए कई कॉल को चेन कर सकते हैं।


1
तलछट क्यों नहीं? $ गूंज "हैलो \ दुनिया" | एसईडी के / \\ / \\\\ / '
अंतरिक्ष

1
@ ऑक्टोपस, वह भी एक वैध विकल्प है। मैं पर्ल के साथ अधिक सहज होना चाहता हूं, लेकिन हां, यह काम भी करता है।
माइकल आरोन सफायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.