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


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.