बैश का उपयोग करके समान लंबाई के दो सबस्ट्रिंग में एक स्ट्रिंग को कैसे विभाजित किया जाए?


12

मैं एक स्ट्रिंग को दो हिस्सों में विभाजित करना चाहता हूं और उन्हें क्रमिक रूप से प्रिंट करना चाहता हूं। उदाहरण के लिए:

abcdef

में

abc
def

वहाँ यह करने के लिए एक सरल तरीका है, या यह कुछ स्ट्रिंग प्रसंस्करण की जरूरत है?


आपके पास आने वाली स्ट्रिंग कैसी है? चर? Stdin? अन्य?
जेफ स्कालर

1
एक चर में। यह वास्तव में मायने नहीं रखता है, क्योंकि कुछ भी काम किया जा सकता है (स्टड इनपुट को एक चर में डाला जा सकता है)।
गेब्रियल डिएगो

यह दक्षता के लिए मायने रखता है, खासकर अगर यह संभवतः-विशाल हो सकता है। और सुविधा के लिए भी।
पीटर कॉर्डेस

जवाबों:


16

पैरामीटर विस्तार और शेल अंकगणित का उपयोग करना :

चर की पहली छमाही होगी:

${var:0:${#var}/2}

चर का दूसरा भाग होगा:

${var:${#var}/2}

तो आप उपयोग कर सकते हैं:

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"

आप निम्न awk कमांड का उपयोग भी कर सकते हैं:

awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'

$ echo abcdef | awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
abc
def

जवाब देने के लिए धन्यवाद!
गैब्रियल डिएगो

संक्षिप्त और सुरुचिपूर्ण समाधान।
डूडी बॉय

3
तुम छुटकारा पा सकते हो $((...)); offऔर lenके हिस्से के ${var:off:len}प्रतिस्थापन पहले से ही गणित अभिव्यक्ति के रूप में मूल्यांकन किया जाता है। उदाहरण: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"। यह प्रलेखित है, और यह बैश में zshऔर ksh93जैसा है।
मच्छी

3
नोट: यदि स्ट्रिंग की लंबाई विषम है, तो यह अभी भी इसे दो भागों में विभाजित करेगा, लेकिन दूसरा एक चरित्र लंबा होगा।
पीटर - मोनिक

8

उपयोग split, यहाँ तार और कमांड प्रतिस्थापन:

var=abcdef
printf '%s\n' "$(split -n1/2 <<<$var)" "$(split -n2/2 <<<$var)"

7

एक और awkस्क्रिप्ट हो सकती है:

echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'

1
ध्यान दें कि यह विभाजन /और /ERE/ऑपरेटर की वाक्यविन्यास अस्पष्टता के कारण mawk या बिजीबॉक्स awk के साथ काम नहीं करता है , और इसके ()लिए वैकल्पिक होने का विशेष मामला length(फिर भी उन कार्यान्वयनों के मामले में पोसिक्स अनुरूप नहीं हैं)। के बजाय length()या length($0)यहाँ का उपयोग करना lengthउन लोगों के लिए मदद करेगा। आप ऐसा भी कर सकते हैं awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdefजो पाइप और अतिरिक्त प्रक्रिया को बचाएगा और स्ट्रिंग के न्यूलाइन वर्ण होने पर भी यह काम करेगा।
स्टीफन चेजलस

1

अजगर ३

s = input()  # Take one line of input from stdin.
x = len(s) // 2  # Get middle of string. "//" is floor division
print(s[:x], s[x:], sep="\n")  # Print "s" up to "x", then "s" past "x", joined on newlines.

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

$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def

यदि स्ट्रिंग की लंबाई एक समान संख्या नहीं है, तो दूसरी पंक्ति लंबी होगी। उदाहरण के लिए

$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.