2013-04-09 3 views
11

नोब में एक चर के लिए एक स्ट्रिंग का एक हिस्सा निकालने, क्षमा करें अगर एक repost। मैं एक फ़ाइल से एक स्ट्रिंग निकालने रहा हूँ, और एक लाइन के साथ खत्म, कुछ की तरह:बाश

abcdefg:12345:67890:abcde:12345:abcde 

मान लें कि यह testString मूल्यों की लंबाई के बीच कोलन स्थिर नहीं है नाम के एक चर में है, लेकिन मैं चाहता हूँ संख्या को बचाने के लिए, एक स्ट्रिंग ठीक है, एक चर के लिए, दूसरे और तीसरे कॉलन के बीच। इसलिए इस मामले में मैं अपने नए चर के साथ समाप्त हो जाऊंगा, आइए इसे निकाले गए नंबर, 678 9 0 होने के नाते। मुझे लगता है कि मुझे sed का उपयोग करना है, लेकिन कभी इसका इस्तेमाल नहीं किया है और इसके चारों ओर अपना सिर लेने की कोशिश कर रहा है ... क्या कोई मदद कर सकता है? चीयर्स

एक साइड-नोट पर, मैं अक्षरों की पहली स्ट्रिंग को खोजकर, स्ट्रिंग से पूरी लाइन निकालने के लिए खोज का उपयोग कर रहा हूं, इस मामले में abcdefg भाग।

+0

संभावित डुप्लिकेट [बैश वैरिएबल से व्हाइटस्पेस को ट्रिम कैसे करें?] (Http://stackoverflow.com/questions/369758/how-to- ट्रिम-व्हाइटस्पेस-से-बैश-वेरिएबल) – user2284570

उत्तर

9

यहाँ एक और शुद्ध बैश तरीका है। जब आपका इनपुट उचित रूप से सुसंगत होता है तो ठीक काम करता है और आपको उस अनुभाग में अधिक लचीलापन की आवश्यकता नहीं होती है जिसमें आप चुनते हैं।

extractedNum="${testString#*:}"  # Remove through first : 
extractedNum="${extractedNum#*:}" # Remove through second : 
extractedNum="${extractedNum%%:*}" # Remove from next : to end of string 

जबकि यह उदाहरण के लिए पढ़ना, थोड़ी देर के पाश में तुम भी फ़ाइल फ़िल्टर कर सकते हैं:

while IFS=' ' read -r col line ; do 
    # col has the column you wanted, line has the whole line 
    # # # 
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile") 

एसईडी आदेश 2 स्तंभ चुनने और एक साथ पूरे लाइन से है कि मूल्य परिसीमन है अंतरिक्ष। यदि आपको पूरी लाइन की आवश्यकता नहीं है, तो प्रतिस्थापन से स्पेस + & हटाएं और लाइन वैरिएबल को पढ़ने से छोड़ दें। आप \ {2 \} बिट में संख्या को बदलकर कोई भी कॉलम चुन सकते हैं। (अगर आप वहां एक चर का उपयोग करना चाहते हैं तो कमांड को कम कोट्स में रखें।)

+0

पुरानी पोस्ट, लेकिन क्योंकि आपका उत्तर स्वीकार कर लिया गया था, क्या आप इसे 'पूर्ण <<(sed ...)' वाक्यविन्यास के इतने कम संक्षिप्त स्पष्टीकरण के साथ पूरा कर सकते हैं? (sed भाग स्पष्ट है, मैं दो दाएं से बाएं रीडायरेक्ट के बारे में सोच रहा हूं- जैसे <। टीएक्स। – Cbhihe

5

आप इस तरह के सामान के लिए cut का उपयोग कर सकते हैं। ये रहा:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR 

इसके बारे में मस्ती के लिए, यह मैं कैसे (नहीं) sed के साथ ऐसा होता है, लेकिन मैं वहाँ आसान तरीके यकीन है। मुझे लगता है कि है कि भविष्य पाठकों के लिए मेरी खुद की एक सवाल होगा;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/" 
+0

बिजली प्रतिक्रिया के लिए धन्यवाद, मैं इसे जाने दूंगा! –

+0

और एक और नोट पर, मैं बाद में उस नंबर को फिर से एक नई स्ट्रिंग में रखने के लिए कैसे उपयोग करूंगा, जो दूसरे और तीसरे कॉलन के बीच में है? –

+0

मुझे लगता है कि 'awt' बेहतर है जितना अधिक पूरा हो जाता है।Sed के साथ, आप 'echo abcdefg कर सकते हैं: 12345: 67890: abcde: 12345: abcde | sed -e "s/\ ([^:] *: [^:] *: \) [^:] * \ (:। * \)/\ 1WHATEVER \ 2 /" ' – Miquel

2

यह आपके लिए काम करना चाहिए:

kent$ newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3') 

kent$ echo $newVar 
67890 

: महत्वपूर्ण हिस्सा awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3') 

उदाहरण है यदि आपका टेक्स्ट var testString में संग्रहीत किया गया था, तो आप:

kent$ echo $testString                                      
abcdefg:12345:67890:abcde:12345:abcde 
kent$ newVar=$(awk -F: '$0=$3' <<<"$testString") 
kent$ echo $newVar                                       
67890 
13

शुद्ध एक सरणी का उपयोग कर बैश:

testString="abcdefg:12345:67890:abcde:12345:abcde" 
IFS=':' 
array=($testString) 
echo "value = ${array[2]}" 

उत्पादन:

value = 67890 
+0

बहुत सुरुचिपूर्ण (+1), लेकिन (दुर्भाग्य से) बैश जैसे लिनक्स शैल का समर्थन करने वाले सरणी के लिए केवल मान्य है! – Cbhihe

+2

यह सुनिश्चित करता है कि ओपी ने क्या पूछा है ... bash –

संबंधित मुद्दे