একটি স্ট্রিংয়ের চারপাশে একটি খোলার এবং বন্ধ স্কোয়ার বন্ধনী উভয়কে সরাতে সেড ব্যবহার করা


18

আমি এই কমান্ডটি উবুন্টু 12.04.1 এলটিএস-এ ব্যাশ শেলের মধ্যে চালাচ্ছি। আমি উভয় [এবং ]অক্ষর উভয়ই মুছে ফেলার চেষ্টা করছি একদম ঝাপিয়ে পড়েছে, অর্থাত্ দ্বিতীয়বার সিড করার জন্য পাইপ না করে।

আমি জানি বর্গাকার বন্ধনীগুলির একটি রেইগেক্সের বিশেষ অর্থ রয়েছে তাই আমি ব্যাকস্ল্যাশ দিয়ে প্রিপেন্ড করে এড়াতে চলেছি। আমি যে ফলাফলটির প্রত্যাশা করছিলাম তা কেবল স্ট্রিং 123তবে বর্গাকার বন্ধনীগুলি রয়ে গেছে এবং আমি কেন তা জানতে আগ্রহী!

~$ echo '[123]' | sed 's/[\[\]]//'
[123]

আমি শেষ পর্যন্ত যা অর্জন করতে চাইছি তা হ'ল আমার ব্যাশ স্ক্রিপ্টের অন্য কোথাও ব্যাশ ভেরিয়েবলের জন্য স্কয়ার বন্ধনীগুলির মধ্যে যা কিছু আছে তা বরাদ্দ করা, সুতরাং যদি এটি অর্জনের আরও ভাল উপায় থাকে তবে (অ্যাড, সম্ভবত?), দয়া করে আমাকে জানান ।
Xhantar

2
একটি মন্তব্য হিসাবে কেবল যোগ: আপনি বাশের পিই বৈশিষ্ট্যটি এতে ব্যবহার করতে পারেন: str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
ভ্যালেন্টাইন বাজরামি

1
@ val0x00ff - খাঁটি বাশ প্রতিস্থাপন .. ধন্যবাদ! :) নতুন কিছু শিখেছি।
জাভন্তর

উত্তর:


24

এটি সহজ, যদি আপনি সাবধানে ম্যানুয়ালটি অনুসরণ করেন : একটি অক্ষর শ্রেণীর সমস্ত সদস্য বিশেষ অর্থ (কিছু ব্যতিক্রম বাদে) হারায় lose এবং] তালিকায় এটি প্রথমে রাখলে এর বিশেষ অর্থ হারাবে । চেষ্টা করুন:

$ echo '[123]' | sed 's/[][]//g'
123
$

এটি বলে:

  1. বাইরের [বন্ধনী] এর ভিতরে , অন্তর্ভুক্ত যে কোনও অক্ষর প্রতিস্থাপন করুন:
    • ] এবং
    • [
  2. এগুলির যে কোনও একটিকে খালি স্ট্রিং দ্বারা প্রতিস্থাপন করুন - তাই খালি প্রতিস্থাপনের স্ট্রিং //,
  3. এগুলি সর্বত্র ( বিশ্বব্যাপী ) প্রতিস্থাপন করুন - তাই ফাইনাল g

আবার যখনই এটি অন্তর্ভুক্ত করা হবে তখন ] অবশ্যই ক্লাসে প্রথম হতে হবে।


11

আমি নিশ্চিত না যে এটি কেন কাজ করে না তবে এটি করে:

echo '[123]' | sed 's/\(\[\|\]\)//g'

অথবা এটা:

echo '[123]' | sed -r 's/(\[|\])//g'

আপনি একটি পৃথক পদ্ধতির চেষ্টা করতে পারেন এবং বন্ধনীগুলির মধ্যে স্ট্রিংটি মেলাতে পারেন (ধরে নেওয়া যায় যে স্ট্রিংটি সহজেই মেলা যায় এবং বন্ধনী দ্বারা সংজ্ঞায়িত হয় না):

echo '[123]' | egrep -o "[0-9]+"

আপনার আসল রেজেক্স ব্যবহার করে grepআমার একই সমস্যা হচ্ছে তাই আমি সন্দেহ করি এটি কেবল একটি sedজিনিস নয়।

অদ্ভুতভাবে, এগুলি বিভিন্ন ফলাফল দেয় তবে এর মধ্যে একটির সাথে আপনি যা চান তার সাথে মেলে:

echo '[123]' | egrep -o '[^][]+'
123

echo '[123]' | egrep -o '[^[]]+'
3]

এটি আপনার আসলটিতে প্রয়োগ করা sed(এবং /gসংশোধক যুক্ত করা যাতে এটি উভয় বন্ধনী সরিয়ে দেয় ):

echo '[123]' | sed 's/[][]//g'
123

আপনার তৃতীয় পদ্ধতির (egrep -o ...) আমার সমস্যার পরিষ্কার সমাধান হিসাবে মনে হচ্ছে। আমার বর্গাকার বন্ধনীগুলির মধ্যে কেবলমাত্র পূর্ণসংখ্যা থাকবে (এবং দুঃখিত, আমার প্রশ্নে আমার এটি উল্লেখ করা উচিত ছিল) তাই আমার মনে হয় এমন কোনও প্রতিকূলতার মধ্যে না চলে যাওয়া উচিত। ধন্যবাদ!
Xhantar

3
আপনি এটিও ব্যবহার করতে পারেন tr: echo '[123]' | tr -d '[]'- পালানোর বিষয়ে regexp বিভ্রান্তি এড়ায়।
জেমস ও গর্মন

@ জেমস ও'গরম্যান - আকর্ষণীয়। কিছু কারণে আমি ভেবেছিলাম যে trএকবারে কেবল একটি চরিত্রের সর্বোচ্চ অনুবাদ করতে পারি তবে আমি ভুল ছিল। ধন্যবাদ!
Xhantar

4

বন্ধনীগুলির আগে এবং পরে সমস্ত কিছু অপসারণ করতে:

$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123

যদি আপনার ডেটা সদৃশ হয় বর্গ বন্ধনী দিয়ে শুরু এবং শেষের অর্থ:

$ echo '[123]' | sed 's/.//;s/.$//;'
123

আমি যে ডেটা নিয়ে কাজ করছি তা সর্বদা শুরু হবে এবং একটি হ'ল বর্গ বন্ধনী দিয়ে শেষ হবে। আমি এখনও জানতে চাই কেন আমার সমাধানটি কেন কাজ করছে না। কোন ধারনা? এবং 2x রেজেক্সের উল্লেখ না করে এটি করার কোনও উপায় আছে?
জাভন্তর

1
@ গুরু এই সমাধানটি আমার কাছ থেকে কাজ করেছে, এবং জান্তর হিসাবে, এটি একটি দেরীতে জবাব, তবে আমি আপনার কোড এবং টিএলডিপি.আরজে বাশ বিগিনিয়ার্স গাইড থেকে যা দেখতে পাচ্ছি, আপনি একাধিক অনুসন্ধান এবং প্রতিস্থাপন করার চেষ্টা করছেন, এর জন্য একটি '[' এবং অন্যটির জন্য ']' যা কাজ করবে না, দুটি পৃথক অনুসন্ধানের স্থান এবং প্রতিস্থাপন ";" অথবা -e বিকল্পগুলি। এর / <অনুসন্ধান> / <স্থান>> জি; এস / <অনুসন্ধান> / <
রিসার্চ

1

আপনার যদি 'abcdef [123] ghijk' এর মতো আরও জটিল স্ট্রিং থাকে তবে আপনি কেবল বর্গাকার বন্ধনীগুলির মধ্যে পাঠ্য আহরণ করতে অভ্যন্তরীণ ব্যাশ কমান্ড 'কাট' ব্যবহার করতে পারেন:

$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123

1

আপনি খোলার বন্ধনী ব্যবহার করে পালাতে পারেন \[। বন্ধ বন্ধনী জন্য, ব্যবহার করুন []]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.