मैं शेल चर से रिक्त स्थान कैसे निकालूं?


15

मैंने कमांड लाइन पर निम्न कार्य किया है:

$ text="name with space"
$ echo $text
name with space

मैं tr -d ' 'रिक्त स्थान को हटाने के लिए उपयोग करने की कोशिश कर रहा हूं और इसका परिणाम है:

namewithspace

मैंने कुछ चीजें आजमाई हैं:

text=echo $text | tr -d ' '

अब तक कोई भाग्य नहीं है उम्मीद है कि आप अद्भुत लोक मदद कर सकते हैं!

जवाबों:


45

बैश में, आप बैश के अंतर्निहित स्ट्रिंग हेरफेर का उपयोग कर सकते हैं। इस मामले में, आप कर सकते हैं:

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

स्ट्रिंग हेरफेर ऑपरेटरों पर अधिक के लिए, http://tldp.org/LDP/abs/html/string-manipulation.html देखें

हालाँकि, आपकी मूल रणनीति भी काम करेगी, आपका सिंटैक्स थोड़ा बंद है:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

मैंने ऐसा सोचा भी नहीं था, इस पर काम कर रहे एक मूड में था! साथ ही शानदार जवाब!
user3347022

11

आपको इसके लिए echoकमांड की आवश्यकता नहीं है , बस यहां स्ट्रिंग का उपयोग करें:

text=$(tr -d ' ' <<< "$text")

बस जिज्ञासा के लिए मैंने जाँच की कि विभिन्न उपकरणों के लिए इस तरह के एक तुच्छ कार्य में कितना समय लगता है। यहां परिणाम सबसे धीमे से सबसे तेज क्रमबद्ध किए गए हैं:

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

शुद्ध शेल ऑपरेशन निश्चित रूप से सबसे तेज है जो आश्चर्यजनक नहीं है, लेकिन क्या वास्तव में प्रभावशाली है कि यह 100 गुना अधिक तेज है फिर सबसे धीमी कमान है!


यह हमेशा सही नहीं है stackoverflow.com/q/14967299
स्टीवन पेनी

5

बस नीचे के रूप में अपने पाठ चर को संशोधित करें।

text=$(echo $text | tr -d ' ')

हालाँकि, अगर हमारे पास नियंत्रण वर्ण हैं, तो यह टूट सकता है। इसलिए, कैस्परर्ड के सुझाव के अनुसार, हम इसके आसपास दोहरे उद्धरण चिह्नों को रख सकते हैं। इसलिए,

text="$(echo "$text" | tr -d ' ')"

एक बेहतर संस्करण होगा।


आश्चर्यजनक! मैं soooo करीब था। एक नोब के रूप में मैं खुश हूँ मैं सही दिशा में जा रहा था! तेजी से प्रतिक्रिया के लिए धन्यवाद, साथ ही जैसे ही मैंने 8 मिनट इंतजार किया मैं इसे जवाब के रूप में प्रस्तुत करूंगा!
user3347022

@ user3347022, आपका स्वागत है :)
रमेश

1
यदि $textनियंत्रण पात्रों में यह टूटने वाला है , जिसकी व्याख्या शेल द्वारा की जाएगी। बेहतर है कि कुछ दोहरे उद्धरणों को वहाँ रखें:text="$(echo "$text" | tr -d ' ')"
kasperd

@kasperd, इसका उल्लेख करने के लिए धन्यवाद। मैंने आपके सुझाव को शामिल कर लिया है।
रमेश


2

एक विशेष मामला जब आपको एक चर की आवश्यकता होती है जिसमें एक नंबर होता है:

श:

typeset -i A=B #or
typeset -i A="   23232"

क्ष:

typeset -n A=B #or
typeset -n A="   23232"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.