एक पात्र को दूसरे के साथ बैश में बदलें


223

मैं ऐसा करने में सक्षम होने के लिए एक स्ट्रिंग में एक स्पेस ( ) को .बैश में एक स्ट्रिंग ( ) के साथ बदलने की आवश्यकता है ।

मुझे लगता है कि यह बहुत सरल होगा, लेकिन मैं नया हूं इसलिए मैं यह नहीं जान सकता कि इस उपयोग के लिए एक समान उदाहरण को कैसे संशोधित किया जाए।

जवाबों:


390

इनलाइन शेल स्ट्रिंग प्रतिस्थापन का उपयोग करें। उदाहरण:

foo="  "

# replace first blank only
bar=${foo/ /.}

# replace all blanks
bar=${foo// /.}

अधिक जानकारी के लिए http://tldp.org/LDP/abs/html/string-manipulation.html देखें ।


1
शॉर्ट स्ट्रिंग्स (सामान्य मामला, मुझे लगता है) के साथ काम करते समय यह समाधान अच्छा है, जबकि एक trलंबे स्ट्रिंग्स के लिए पसंद कर सकता है । मेरे सिस्टम पर trआउटपरफॉर्मर 1000पात्रों से अधिक स्ट्रिंग्स के साथ शुरू होने वाले बैश हैं । ऐसा लगता है जैसे बैश का समय जटिलता रैखिक से भी बदतर है। एक छोटी सी परीक्षण: x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"। 1M की एक स्ट्रिंग की लंबाई के साथ (= 2 ^ 20) trले लिया 0.04sऔर बैश 5.0.11 ले लिया 17s। 2 एम के साथ trले लिया 0.07s(उम्मीद), लेकिन पार्टी में ले लिया 69s(दो बार स्ट्रिंग की लंबाई के लिए लंबे समय के रूप में 4 बार)।
सोकोवई

@Socowi एक चर में संग्रहीत 1Mb के साथ खेलना वास्तव में सामान्य नहीं है! 10Kb से अधिक तक, बैश फोर्किंग की तुलना में तेज रहना प्रतीत होता है tr! ... उपलब्ध स्मृति और hw संसाधनों पर निर्भर करता है। लेकिन आप सही हैं!: काम करने के लिए तरह तरह के आधार पर, समर्पित उपकरण अधिक कुशल रहते हैं!
एफ। हौरी

नई-पंक्तियों की तरह बच गए वर्णों के लिए, के लिए खोज करने के लिए सुनिश्चित करें$'\n'
user2561747

75

आप trइस तरह का उपयोग कर सकते हैं :

tr " " .

उदाहरण:

# echo "hello world" | tr " " .
hello.world

से man tr:

वर्णन
     अनुवाद, निचोड़, और / या मानक इनपुट से वर्णों को हटा दें, मानक आउटपुट में राइट।


हालांकि यह सवाल के लिए काम करता है क्योंकि यह पूछा गया था, यह स्वीकृत उत्तर (जो चरित्र प्रतिस्थापन पर काम करता है और मनमाना तार भी है) से कम सामान्य है, और इसमें शामिल और बाहरी कमांड भी शामिल है।
डेन डैस्कलेस्कु

2
दूसरी ओर यह 2gb फ़ाइल में पूरी चीज़ को मेमोरी में लोड किए बिना काम करता है।
aioobe

सवाल "बैश में एक स्ट्रिंग" के बारे में था, न कि मनमाने ढंग से बड़ी फ़ाइलों के लिए।
डैन डेस्केल्सकू

52

बैश में, आप निर्माण के साथ एक स्ट्रिंग में पैटर्न प्रतिस्थापन कर सकते हैं ${VARIABLE//PATTERN/REPLACEMENT}। सिर्फ /और सिर्फ //पहली घटना को बदलने के लिए उपयोग करें । पैटर्न एक वाइल्डकार्ड पैटर्न है, जैसे फ़ाइल ग्लब्स।

string='foo bar qux'
one="${string/ /.}"     # sets one to 'foo.bar qux'
all="${string// /.}"    # sets all to 'foo.bar.qux'



4

पथों के लिए यह प्रयास करें:

echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'

यह एक +गायन के साथ डबल-उद्धृत स्ट्रिंग के अंदर स्थान को बदलता है, फिर +एक बैकस्लैश के साथ संकेत को बदलता है , फिर डबल-कोट्स को हटा / बदल देता है।

मुझे साइग्विन में अपने एक पथ में रिक्त स्थान को बदलने के लिए इसका उपयोग करना पड़ा।

echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'

2
पहले से ही दो साल पुराना उत्तर है जो समस्या का हल करता है sed। उद्धरण अप्रासंगिक हैं।
चेपनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.