जवाबों:
एक उदाहरण उपयोगी हो सकता है, लेकिन अगर मैंने आपको सही ढंग से समझा, तो यह काम करेगा:
echo "Hello: world" | cut -f1 -d":"
यह "हैलो: वर्ल्ड" को "हैलो" में बदल देगा।
basenameऔर cut, डेनिस का जवाब नीचे देखें
cutस्टडिन से पढ़ सकते हैं, इसलिए यह विशेष रूप से बेहतर है जब आपके पास एक बहुत लंबी स्ट्रिंग है जिसे आपको फ़ाइल की सामग्री की तरह संसाधित करने की आवश्यकता है।
hello: world। यह आधा उत्तर है।
बैश (और ksh, zsh, डैश, आदि) में, आप पैरामीटर विस्तार का उपयोग कर सकते हैं %जिसके साथ स्ट्रिंग के अंत से #वर्ण हटाए जाएंगे या जो स्ट्रिंग की शुरुआत से वर्ण हटा देंगे। यदि आप उन वर्णों में से एक का उपयोग करते हैं, तो सबसे छोटा मिलान स्ट्रिंग हटा दिया जाएगा। यदि आप चरित्र को दोगुना करते हैं, तो सबसे लंबे समय तक हटा दिया जाएगा।
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:worldसे बन जाएगा ? hello:wo${a%:*}
"${a##*:}"केवल tomorrow= पाने के लिए भी जोड़ना अच्छा होगा )
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ पैटर्न]]; गूंज "$ {BASH_REMATCH [1]}" `। यह तभी मेल खाता है जब कोई कॉलन हो। यदि आप चाहते हैं कि वैकल्पिक होने के लिए, एक अलग पैटर्न का उपयोग करना होगा। बैश रेगेक्स (और सामान्य रूप से रेग्जेस) का स्पष्टीकरण इन टिप्पणियों के दायरे से परे है। आप अन्य प्रश्न पा सकते हैं जो इस पर चर्चा करते हैं या अपना स्वयं का पोस्ट करते हैं।
egrep -o '^[^:]*:'
egrepसाथ ग्रेप है -E। यह यहाँ नियमित से कोई फर्क नहीं पड़ता grep। -ogrep को निर्देश देता है कि वह अभिव्यक्ति से मेल खाने वाली रेखा के केवल एक भाग को प्रिंट करे। ^एक लाइन की शुरुआत के लिए मैच लंगर डाले। [^:]*शून्य या अधिक वर्णों से मेल खाता है जो :वर्ण नहीं हैं । :चरित्र से मेल खाता है :।
मान लीजिए कि आपके पास इस प्रारूप में फ़ाइल के साथ एक पथ है:
/dirA/dirB/dirC/filename.file
अब आप केवल वह रास्ता चाहते हैं जिसमें चार "/" शामिल हों। प्रकार
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
और आपका आउटपुट होगा
/dirA/dirB/dirC
कट का उपयोग करने का लाभ यह है कि आप बड़े निर्देशिका के साथ-साथ फ़ाइल (इस उदाहरण में) को भी काट सकते हैं, इसलिए यदि आप टाइप करते हैं
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
आपका आउटपुट होगा
/dirA/dirB
यद्यपि आप इसे स्ट्रिंग के दूसरी तरफ से भी कर सकते हैं, लेकिन यह टाइपिंग के रूप में इस मामले में बहुत मायने नहीं रखेगा
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
का परिणाम
dirA/dirB/dirC
कुछ अन्य मामलों में अंतिम मामला भी मददगार हो सकता है। मन कि अंतिम आउटपुट की शुरुआत में कोई "/" नहीं है।
":" के अंतिम उदाहरण के बाद सब कुछ ट्रिम करें
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
और यदि आप उस अंतिम को गिराना चाहते हैं ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: आप बदलना चाहते चाहते हैं :के साथ /(जहां sed पेट होना चाहिए \/)
cutकाम करता है, लेकिन मैं डेनिस का जवाब बेहतर और अधिक लचीला है। किसी को पता है कि अगर यह एक नई प्रक्रिया की तरह हैcut?