2009-12-29 10 views
34

मैं कैसे अजगर में यह करने के लिए, बस के साथबैश में एक या अधिक रिक्त स्थान से अलग शब्दों में एक पंक्ति को विभाजित करने के लिए कैसे?

line = db_file.readline() 
ll=string.split(line) 

एहसास लेकिन मैं कैसे बैश में एक ही कर सकते हैं? क्या यह वास्तव में एक आसान तरीके से करना संभव है?

+0

मुझे लगता है कि आप पाइथन में 'll = str.split (line)' का अर्थ है। – Arthur

उत्तर

4

-aread का विकल्प आपको $IFS में वर्णित वर्णों द्वारा पढ़ने वाली रेखा को विभाजित करने की अनुमति देगा।

+0

#/bin/bash फ़ाइल नाम = $ 1 जबकि लाइन पढ़ \t गूंज $ लाइन है! | read -a किया गया <$ filename क्या यह काम करना चाहिए? – asdf

+0

नहीं, - पहले पढ़ने के लिए एक तर्क होगा। एक बैश कमांड लाइन पर "मदद पढ़ने" होगा, ओह ... मदद करें। –

+2

@asdf: यह इस तरह दिखेगा: 'filename = $ 1; जबकि पढ़ा- एक लाइन; echo "$ LINE" करें; मुझे <-$ filename "' –

9
$ line="these are words" 
$ ll=($line) 
$ declare -p ll # dump the array 
declare -a ll='([0]="these" [1]="are" [2]="words")' 
$ for w in ${ll[@]}; do echo $w; done 
these 
are 
words 
+1

+1 मुझे -p विकल्प – grok12

110
s='foo bar baz' 
a=($s) 
echo ${a[0]} 
echo ${a[1]} 
... 
+1

सिखाए जाने के लिए +1, मैं इसे देख रहा था, धन्यवाद – asdf

+14

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए – jaywink

+0

इनलाइन संस्करण: BAR = "$ (a = ($ value); $ {एक [1]}) " –

28

यह तुम क्या मतलब है विभाजित द्वारा पर निर्भर करता है। यदि आप एक पंक्ति में शब्दों पर पुनरावृत्ति करना चाहते हैं, जो एक चर में है, तो आप बस पुनरावृत्त कर सकते हैं। उदाहरण के लिए, मान लें कि परिवर्तनीय linethis is a line है। तो फिर तुम यह कर सकते हैं:

for word in $line; do echo $word; done 

यह प्रिंट होगा: $IFS में

this 
is 
a 
line 

for .. in $var विभाजन $var मानों का उपयोग करते हैं, जिनमें से डिफ़ॉल्ट मान "विभाजित कारतूस और नई-पंक्तियों" का अर्थ है।

cat $filename | while read line 
do 
    echo "Processing new line" >/dev/tty 
    for word in $line 
    do 
     echo $word 
    done 
done 

कुछ और के लिए, आप अधिक स्पष्ट हो सकता है और अधिक विस्तार में अपने प्रश्न परिभाषित करने की जरूरत:

आप उपयोगकर्ता या एक फ़ाइल से लाइनों को पढ़ने के लिए चाहते हैं, आप की तरह कुछ कर सकते हैं।

नोट: बैशिज्म को हटाने के लिए संपादित किया गया, लेकिन मैंने अभी भी cat $filename | ... रखा क्योंकि मुझे इसे पुनर्निर्देशन से अधिक पसंद है।

+5

' बिल्ली' का बेकार उपयोग - इस तरह की फ़ाइल को रीडायरेक्ट करें: 'किया <" $ filename "'। इसके अलावा, सूचकांक चर के बजाय इस संदर्भ में $ {var [@]} "' में मान के लिए 'का उपयोग करें। इस मामले में सरणी संगत हो सकती है, बैश स्पैर एरे का समर्थन करता है और '$ {# var [@]}' अंतिम प्रविष्टि नहीं हो सकता है (हालांकि '$ {var [@]: -1} 'होगा और' सूचकांक = ($ {! एक [@]}); गिनती = $ {# सूचकांक [@]} 'सूचकांक और सही गिनती की सूची देगी) –

+1

@ डेनिस: सभी अच्छे अंक। मैं 'बिल्ली ए' के ​​लिए प्रयोग किया जाता है किसी कारण से 'blah

+1

यदि आपके पास $ line में एक तारांकन (*) अच्छा है तो यह दृष्टिकोण विफल हो जाएगा। वर्तमान निर्देशिका में फ़ाइल सूची के साथ बैश प्रतिस्थापित होगा। – crenate

2

आप पहले से ही एक चर $ लाइन में पाठ की अपनी लाइन है, तो आप कहना

for L in $LINE; do 
    echo $L; 
done 
9

इस

while read -r line 
do 
    set -- $line 
    echo "$1 $2" 
done <"file" 

$ 1, अपने 1 $ 2 आदि हो जाएगा करने के लिए सक्षम होना चाहिए और दूसरा विभाजित "फ़ील्ड"। सभी फ़ील्ड प्राप्त करने के लिए $ @ का उपयोग करें .. "फ़ील्ड" की लंबाई प्राप्त करने के लिए $ # का उपयोग करें।

+1

ध्यान दें कि यदि आपकी '$ line' में उदा। '*', 'सेट - $ लाइन' करते समय इसे बाश द्वारा विस्तारित किया जाएगा, जिसमें आश्चर्यजनक प्रभाव हो सकते हैं। – clacke

+0

1) "-" क्या करता है? 2) क्या आश्चर्यजनक प्रभाव * विस्तार कर सकते हैं? – Xofo

27

यदि आप लाइन से एक विशिष्ट शब्द चाहते हैं, तो बहुत उपयोगी हो सकता है, उदा।

 
$ echo $LINE | awk '{print $2}' 

$ WHE में दूसरे व्हाइटस्पेस से अलग शब्द मुद्रित करता है। आप अन्य पात्रों पर भी विभाजित कर सकते हैं, उदा।

 
$ echo "5:6:7" | awk -F: '{print $2}' 
6 
+1

अभी यह अजीब उपयोग शुरू करने का मेरा कारण है। सरणी निर्माण और अतिरिक्त लाइनों के विपरीत। -एफ: बस एक ही पंक्ति में: से विस्फोट करता है। इसे प्यार करो, thx। – erm3nda

+0

आगे: 'echo" 5 :: 6: 7 "| awk -F :: '{प्रिंट $ 2}' ' ' 6: 7' (अलग से कट से, जो केवल एक char को delimiter के रूप में लेता है) – ribamar

5

अधिक सरल,

echo $line | sed 's/\s/\n/g' 

\s --> whitespace character (space, tab, NL, FF, VT, CR). In many systems also valid [:space:]

\n --> new line

15
echo $line | tr " " "\n" 

उत्पादन ऊपर अधिकतर उत्तर के समान ही देता है; लूप का उपयोग किए बिना।


आपके मामले में, आप भी ll=<...output...> उल्लेख
हां, (यह देखते हुए कि मैं बहुत अजगर और आप एक चर करने के लिए उत्पादन में निर्दिष्ट करना यह सोचते हैं पता नहीं है),

ll=`echo $line | tr " " "\n"` 

पर्याप्त होना चाहिए (echo $ll के बजाय echo "$ll" को याद रखें)

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