2012-07-31 12 views
13

मैं निम्नलिखित प्रारूप में एक स्ट्रिंग है:अक्षरों में स्ट्रिंग्स की सरणी में अक्षर n "युक्त बहु-पंक्ति स्ट्रिंग को कैसे विभाजित करें?

$ echo "${ARRAY[0]}" 
I'm\nNed\nNederlander 

$ echo "${ARRAY[1]}" 
I'm\nLucky\nDay 

$ echo "${ARRAY[2]}" 
I'm\nDusty\nBottoms 

हालांकि, मैं कर रहा हूँ:

I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms 

मैं ऐसा है कि लाइन द्वारा तार लाइन की एक सरणी को यह स्थानांतरित करना चाहते हैं स्ट्रिंग के भीतर "\ n" वर्णों के साथ समस्याओं में चल रहा है। स्ट्रिंग में उन्हें दो अलग-अलग वर्ण, बैकस्लैश और 'एन' के रूप में दर्शाया जाता है, लेकिन जब मैं सरणी विभाजन करने की कोशिश करता हूं तो उन्हें न्यूलाइन के रूप में व्याख्या किया जाता है। इस प्रकार IFS के साथ विशिष्ट स्ट्रिंग विभाजन काम नहीं करता है।

उदाहरण के लिए:

$ read -a ARRAY <<< "$STRING" 
$ echo "${#ARRAY[@]}" # print number of elements 
2 

$ echo "${ARRAY[0]}" 
I'mnNednNederla 

$ echo "${ARRAY[1]}" 
der 
+0

Btw, किसी को भी एसई के ठीक करने के लिए पता है उपरोक्त कोड का भयानक स्वरूपण? –

+0

"भयानक प्रारूपण" एस्ट्रोफ्रेश के कारण एकल उद्धरण के रूप में व्याख्या किया जा रहा है (जिसे यह संतुलित करने की अपेक्षा करता है)। "कोड" टैग के बजाय "ब्लॉक उद्धरण" टैग का प्रयोग करें। – twalberg

उत्तर

24

डिफ़ॉल्ट रूप से, read builtin \ पात्रों से बचने के लिए अनुमति देता है। इस व्यवहार को बंद करने के लिए, -r विकल्प का उपयोग करें। यह अक्सर ऐसा नहीं होता है जहां आप -r का उपयोग नहीं करना चाहते हैं।

string="I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms" 

arr=() 
while read -r line; do 
    arr+=("$line") 
done <<< "$string" 

आदेश एक-पंक्ति (आप read -a साथ प्रयास कर रहे थे की तरह) में यह करने के लिए, वास्तव में बैश v4 में mapfile या उच्चतर की आवश्यकता:

mapfile -t arr <<< "$string" 
+0

मैपफ़ाइल ऑनलाइनर के लिए हाँ :) –

12

mapfile अधिक सुरुचिपूर्ण है, लेकिन यह संभव है read के साथ एक (बदसूरत) लाइन में यह करने के लिए (उपयोगी आप 4 से अधिक उम्र के बैश के एक संस्करण का उपयोग कर रहे हैं):

IFS=$'\n' read -d '' -r -a arr <<< "$string" 
+0

दरअसल, और -d विकल्प इसे काम करने के लिए महत्वपूर्ण लगता है –

+0

एक चेतावनी मुझे यह नहीं पता था कि जब मैंने इसे पोस्ट किया था: बाहर निकलने की स्थिति शून्य नहीं होगी, क्योंकि यहाँ स्ट्रिंग कभी खत्म नहीं होगी 'read -d' 'जैसे एक शून्य चरित्र की उम्मीद होगी। – chepner

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

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