ব্যাশ ব্যবহার করে একই দৈর্ঘ্যের দুটি সাবস্ট্রিংয়ে একটি স্ট্রিং কীভাবে বিভক্ত করবেন?


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/অপারেটরের সিনট্যাক্স অস্পষ্টতার কারণে এটি মাক বা ব্যস্তবক্স অ্যাডকের সাথে কাজ করে না, এবং এর জন্য beingচ্ছিক ()হওয়ার বিশেষ ক্ষেত্রে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.