2008-09-18 19 views
41

मैं एक साधारण इनपुट लेने के लिए सबसे अच्छा तरीका है के लिए देख रहा हूँ:एक बैश स्क्रिप्ट में, मैं उपयोगकर्ता इनपुट को कैसे स्वच्छ कर सकता हूं?

echo -n "Enter a string here: " 
read -e STRING 

और गैर अक्षरांकीय अक्षर, कम (मामला) को हटाने के द्वारा उसे साफ और अंडरस्कोर वाले रिक्त स्थान की जगह।

क्या ऑर्डर मायने रखता है? tr इस बारे में जाने का सबसे अच्छा/एकमात्र तरीका है?

उत्तर

41

जैसा कि dj_segfault बताता है, शैल आपके लिए इनमें से अधिकतर कर सकता है। ऐसा लगता है कि स्ट्रिंग को कम करने के लिए आपको कुछ बाहरी पर वापस गिरना होगा। इसके लिए आपके पास कई विकल्प हैं, जैसे उपरोक्त पर्ल एक-लाइनर इत्यादि, लेकिन मुझे लगता है कि टी शायद सबसे सरल है।

# first, strip underscores 
CLEAN=${STRING//_/} 
# next, replace spaces with underscores 
CLEAN=${CLEAN// /_} 
# now, clean out anything that's not alphanumeric or an underscore 
CLEAN=${CLEAN//[^a-zA-Z0-9_]/} 
# finally, lowercase with TR 
CLEAN=`echo -n $CLEAN | tr A-Z a-z` 

यहां आदेश कुछ हद तक महत्वपूर्ण है। हम अंडरस्कोर से छुटकारा पाने के लिए, साथ ही अंडरस्कोर के साथ रिक्त स्थान को प्रतिस्थापित करना चाहते हैं, इसलिए हमें पहले अंडरस्कोर को पट्टी करना सुनिश्चित करना होगा। अंत तक चीजों को पार करने की प्रतीक्षा करके, हम जानते हैं कि हमारे पास केवल अल्फान्यूमेरिक और अंडरस्कोर हैं, और हम सुनिश्चित कर सकते हैं कि हमारे पास कोई रिक्त स्थान नहीं है, इसलिए हमें खोल के द्वारा वर्णित विशेष पात्रों के बारे में चिंता करने की आवश्यकता नहीं है।

+1

पाठक को ध्यान दें: यदि आपको यह काम करने में परेशानी हो रही है, तो यह देखने के लिए कि क्या आप बैश या sh को कॉल कर रहे हैं, और आपका सिस्टम 'sh' कैसे व्याख्या करता है, अपने शेबैंग को जांचें। –

+2

बैश 4 के रूप में, यह केस संशोधन भी कर सकता है। 'लोअरकेस = $ {स्वच्छ,}' [बैश हैकर्स विकी] (http: //wiki.bash- hackers।संगठन/वाक्यविन्यास/पे) मैन पेजों की तुलना में अधिक * मानव-पठनीय * तरीके में पैरामीटर विस्तार बताते हैं। – toxalot

+0

अच्छा काम। मुझे पहले इन शैलियों की विशेषताओं से अवगत नहीं था। धन्यवाद! मैंने अभी पाया है कि zsh आपको वास्तव में * घोंसला * इन सभी को अनुमति देता है, ताकि आप इसे एक पंक्ति में कर सकें: 'echo -n $ {$ {$ {str // _ /} ///_} // [^ ए-जेए-जेड -9 _9] /} | tr ए-जेड ए-जेड .. यह नहीं कि मैं कुछ ऐसी चीज डालने की सिफारिश करूंगा जो एक स्क्रिप्ट में समझ में नहीं आता है। :) (संपादित करें: स्वरूपण) –

0

ऐसा लगता है tr चारों ओर देख का एक सा वास्तव में सबसे आसान तरीका है के बाद:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`" 

Occam's razor, मुझे लगता है।

+0

यदि आप 'STRING = $ (आरएम/टीएमपी/*)' सेट करते हैं, तो यदि आप सफाई से पहले $ STRING को प्रतिबिंबित करते हैं, तो यह उप-खोल निष्पादित करेगा और आपकी/tmp/content को हटा देगा ... इसलिए आपको किसी भी गूंज को पूरा करने से पहले इसे संचरित करें – higuita

1

त्वरित और गंदे:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

+0

जब मैं अपने काम पर गया तो मैंने आपका समाधान नहीं देखा था। – Axeman

1

आप इसे पर्ल के माध्यम से चला सकते हैं।

export CLEANSTRING=$(perl -e 'print join(q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING})') 

मैं यहां केश-स्टाइल सबहेल का उपयोग कर रहा हूं, मुझे पूरी तरह से यकीन नहीं है कि यह बाश में काम करता है।

खोल के बारे में अच्छी बात यह है है यही कारण है, कि आप पर्ल का उपयोग कर सकते, awk, SED, ग्रेप ....

29

बैश यह सब अपने आप पर कर सकते हैं, बहुत बहुत धन्यवाद है। आप पैरामीटर विस्तार पर आदमी पृष्ठ के अनुभाग को देखें, तो आपको लगता है कि है कि पार्टी में निर्मित प्रतिस्थापन है देखेंगे, स्ट्रिंग, ट्रिम, rtrim, आदि

सभी गैर अक्षरांकीय अक्षर को खत्म करने के लिए,

CLEANSTRING=${STRING//[^a-zA-Z0-9]/} 

Occam के रेजर है यही कारण है कि। एक और प्रक्रिया शुरू करने की जरूरत नहीं है।

+0

अच्छी तरह से, महान जवाब डाल दिया। मैं इसे महसूस किए बिना पैरामीटर विस्तार का उपयोग कर रहा था। –

+2

यह विनिर्देशों के सबसेट के लिए एक अच्छा जवाब है, लेकिन यह स्पेस को अंडरस्कोर में नहीं बदलता है। – Axeman