2010-09-24 13 views
7

आइए " textfile" में निम्न शामिल हैं:बैश: पाठ-फ़ाइल को गैर-अल्फान्यूमेरिक वर्णों वाले शब्दों में विभाजित करें

lorem$ipsum-is9simply the.dummy text%of-printing 

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

 lorem 
ipsum 
is9simply 
the 
dummy 
text 
of 
printing 

मैं बैश खोल का उपयोग करके इसे कैसे पूरा कर सकता हूं?



कुछ नोट्स:

  • यह होमवर्क प्रश्न नहीं है।

  • सरल मामला जब शब्दों को केवल रिक्त स्थान द्वारा निर्धारित किया जाना चाहिए, यह आसान है। बस लिखना:

    for i in `cat textfile`; do echo $i; done; 
    

    चाल करेगा, और वापसी:

     lorem$ipsum-is9simply 
    the.dummy 
    text%of-printing 
    

    गैर-अल्फान्यूमेरिक वर्णों द्वारा विभाजित शब्दों के लिए मैंने समाधान देखा है जो आईएफएस पर्यावरण चर (नीचे दिए गए लिंक का उपयोग करते हैं)), लेकिन मैं दो कारणों से आईएफएस का उपयोग करने से बचना चाहता हूं: 1) इसे आईएफएस को गैर-अल्फान्यूमेरिक वर्णों की एक लंबी सूची में स्थापित करने की आवश्यकता होगी (मुझे लगता है)। 2) मुझे यह बदसूरत लगता है।

  • यहां दो संबंधित क्यू & हैं जैसा कि मैंने पाया
    How do I split a string on a delimiter in Bash?
    How to split a line into words separated by one or more spaces in bash?

उत्तर

17

उपयोग पाया tr आदेश हैं पूरक हैं निर्दिष्ट वर्णों का; '-s' प्रतिस्थापन के डुप्लिकेट निचोड़ता है; 'a-zA-Z0-9' अल्फान्यूमेरिक वर्णों का सेट है (शायद _ भी जोड़ें?); '\ n' प्रतिस्थापन चरित्र (न्यूलाइन) है। तुम भी एक चरित्र वर्ग जो स्थान संवेदनशील है इस्तेमाल कर सकते हैं (और ऊपर सूची से अधिक शामिल हो सकते हैं):

tr -cs '[:alnum:]' '\n' <textfile 
+0

बिल्कुल सही, यह वास्तव में क्या मैं के बाद किया गया है। धन्यवाद! (मुझे खेद है कि आपके पास जवाब देने के लिए पर्याप्त प्रतिष्ठा नहीं है) – Sv1

+1

@ एसवी 1: शायद आपके पास जल्द ही एक उच्च प्रतिष्ठा होगी। मैंने आपके प्रश्न को वोट दिया क्योंकि आपने जो भी चाहते थे उसे दस्तावेज किया था और आपके द्वारा किए गए सभी शोधों के लिए। – grok12

+0

यदि आपके पास दशमलव संख्याएं हैं तो क्या होगा? – Leyu

3
$ awk -f splitter.awk < textfile 

$ cat splitter.awk 
{ 
    count0 = split($0, asplit, "[^a-zA-Z0-9]") 
    for(i = 1; i <= count0; ++i) { print asplit[i] } 
} 
+0

धन्यवाद रॉस! यह बहुत अच्छा है, मैं अजीब ब्रह्मांड में जाने का मतलब रहा हूं :) – Sv1

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