ডিলিমিটারের প্রথম উপস্থিতি দ্বারা বিভাজন স্ট্রিং


54

আমার পরের ফরম্যাটে একটি স্ট্রিং রয়েছে

id;some text here with possible ; inside

এবং এটির প্রথম উপস্থিতি দ্বারা এটি 2 টি স্ট্রিংতে বিভক্ত করতে চাই ;। সুতরাং, এটি হওয়া উচিত: idএবংsome text here with possible ; inside

আমি জানি কীভাবে স্ট্রিংটি বিভক্ত করতে হবে (উদাহরণস্বরূপ, এর সাথে cut -d ';' -f1) তবে আমার ;বাম অংশের ভিতরে থাকায় এটি আরও অংশে বিভক্ত হবে ।


স্ট্রিং বিভক্ত হওয়ার পরে আপনি "আইডি" দিয়ে কী করতে চান? আপনি কি এটিকে কোনও ভেরিয়েবলের জন্য বরাদ্দ করতে চান, প্রিন্ট আউট করতে চান ইত্যাদি?
কেওস এর ডেমন

আমার 2 ভেরিয়েবল রয়েছে: idএবংstring
গাখভ

উত্তর:


65

cut এর জন্য উপযুক্ত সরঞ্জামের মতো শোনাচ্ছে:

bash-4.2$ s='id;some text here with possible ; inside'

bash-4.2$ id="$( cut -d ';' -f 1 <<< "$s" )"; echo "$id"
id

bash-4.2$ string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
some text here with possible ; inside

তবে readআরও উপযুক্ত:

bash-4.2$ IFS=';' read -r id string <<< "$s"

bash-4.2$ echo "$id"
id

bash-4.2$ echo "$string"
some text here with possible ; inside

3
গ্রেট! এটি যাদুমন্ত্রের মত কাজ করে! আমি readযেহেতু ব্যবহার করছি তা নির্বাচন করব bash। ধন্যবাদ @ মান্যাটওয়ার্ক!
গাখভ

cutপদ্ধতির কেবল তখনই কাজ করবে যখন "$ s" এ নতুন লাইনের অক্ষর থাকবে না। পঠনটি কোনও বোর্নের মতো শেলের মধ্যে রয়েছে। <<< আরসি, জেডএস এবং ব্যাশ এবং ksh93 এর সাম্প্রতিক সংস্করণগুলিতে রয়েছে এবং এটি আদর্শ নয়।
স্টাফেন চেজেলাস

ওফস, আপনি ঠিক @ স্টেফেনচাজেলাস। এর -aউল্লেখ করার সময় আমার মন কিছু কারণে ছিল । (স্পষ্টতই এখানে কোনও কাজে bashread
লাগেনি

আমি উল্লেখ করতে ভুলে গেছি যে read এর মধ্যে যদি নতুন লাইনের অক্ষর থাকে তবে পঠিত পদ্ধতির কাজ হয় না। আমি আমার নিজের উত্তর যুক্ত করেছি।
স্টাফেন চেজেলাস

1
আমি trailing ড্যাশ জোর দেওয়া চাই -f 2-মধ্যে string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"কমান্ড। এটিই প্রিন্টআউটটির জন্য স্ট্রিংয়ের বাকী সীমানিদের উপেক্ষা করে। যখন লোক পৃষ্ঠা এ খুঁজছেন না সুস্পষ্টcut
Steen

17

যে কোনও মানক শ (বশ সহ) সহ:

sep=';'
case $s in
  (*"$sep"*)
    before=${s%%"$sep"*}
    after=${s#*"$sep"}
    ;;
  (*)
    before=$s
    after=
    ;;
esac

readভিত্তিক সমাধানগুলি $sepস্থান, ট্যাব বা নিউলাইন ব্যতীত অন্য একক অক্ষর (এবং কিছু শেল, একক বাইট সহ) মানগুলির জন্য কাজ করবে এবং কেবল যদি $sনতুন লাইনের অক্ষর না থাকে।

cutভিত্তিক সমাধানগুলি কেবল তখনই কাজ করবে যদি $sনিউলাইন অক্ষর না থাকে।

sedসমাধানগুলি এমন কোনও নকশাগুলি তৈরি করা যেতে পারে যা কোনও কোণার কেসগুলির কোনও মান সহ হ্যান্ডেল করে $sep, তবে এটির জন্য শেলের মধ্যে অন্তর্নির্মিত সমর্থন থাকা সত্ত্বেও এটি এতদূর যায়।


6

যেমন আপনি উল্লেখ করেছেন যে আপনি আইডি এবং স্ট্রিংয়ের মানগুলি নির্ধারণ করতে চান

প্রথমে আপনার প্যাটার্নটি ভেরিয়েবলকে নির্ধারণ করুন (বলুন স্ট্রিং)

    str='id;some text here with possible ; inside'
    id=${str%%;} 
    string=${str#;}

এখন আপনার নিজস্ব ভেরিয়েবলগুলিতে আপনার মান রয়েছে


যদি আপনি কোনও কমান্ড থেকে আপনার প্যাটার্নটি পেয়ে থাকেন তবে সেটটি ব্যবহার করুন - some_commandতারপরে আপনার প্যাটার্নটি $ 1 এ সঞ্চিত হবে এবং উপরের কোডটি str
user1678213

এই উত্তরটি কীভাবে @ স্টেফেনচাজেলাসের থেকে আলাদা?
বার্নহার্ড

4

অন্যান্য সমাধানগুলি ছাড়াও, আপনি কিছু regexভিত্তিক চেষ্টা করতে পারেন :

a="$(sed 's/;.*//' <<< "$s")"
b="$(sed 's/^[^;]*;//' <<< "$s")"

বা আপনি যা করতে চাইছেন তার উপর নির্ভর করে আপনি ব্যবহার করতে পারেন

sed -r 's/^([^;]*);(.*)/\1 ADD THIS TEXT BETWEEN YOUR STRINGS \2/'

যেখানে \1এবং \2দুই, সাবস্ট্রিং আপনি অনুপস্থিত ছিল ধারণ করে।


1

স্ট্যান্ডার্ড বাশে সমাধান:

    text='id;some text here with possible ; inside'
    text2=${text#*;}
    text1=${text%"$text2"}

    echo $text1
    #=> id;
    echo $text2
    #=> some text here with possible ; insideDD
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.