সেড ব্যবহার করে স্ট্রিং থেকে কীভাবে পাঠ্য উত্তোলন করা যায়?


98

আমার উদাহরণটি স্ট্রিং নিম্নরূপ:

This is 02G05 a test string 20-Jul-2012

এখন উপরের স্ট্রিং থেকে আমি নিষ্কাশন করতে চাই 02G05। তার জন্য আমি নীচে রেডেক্সকে সেড দিয়ে চেষ্টা করেছি

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

তবে উপরের কমান্ডটি কোনও কিছুই প্রিন্ট করে না এবং আমার বিশ্বাস করার কারণটি যেটি আমি সেডকে সরবরাহ করেছিলাম তার বিপরীতে কোনও কিছুর সাথে মেলে না।

সুতরাং, আমার প্রশ্নটি হচ্ছে আমি এখানে কী ভুল করছি এবং এটি কীভাবে সংশোধন করব।

আমি যখন পাইথন দিয়ে উপরের স্ট্রিং এবং প্যাটার্নটি চেষ্টা করি তখন আমি আমার ফলাফল পাই

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>

6
পাইথন অবশ্যই না sed। তাদের রেগেক্স স্বাদগুলি একেবারেই আলাদা।
ট্রিপলি

উত্তর:


96

প্যাটার্নটি \dআপনার দ্বারা সমর্থিত নাও হতে পারে sed। চেষ্টা করুন [0-9]বা [[:digit:]]পরিবর্তে।

কেবল আসল মিলটি মুদ্রণ করতে (পুরো মিলের লাইন নয়), একটি বিকল্প ব্যবহার করুন।

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'

6
ধন্যবাদ এটি ভাল কাজ করে। তবে আমার একটি প্রশ্ন আছে কেন .*আপনার রেজেক্সের সাথে প্রয়োজনীয় কারণ যখন আমি sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'এটি চেষ্টা করি তখন পুরো লাইনটি মুদ্রণ করে।
রানরাগ

7
তাই বলে, তাই না? ম্যাচের আগে এবং পরে যা আসে তা প্রতিস্থাপন করুন নুরিংয়ের সাথে, তারপরে পুরো লাইনটি মুদ্রণ করুন।
ট্রিপলি

4
@ ট্রিপলি এটি কেবল প্রিন্ট করে 2G05না 02G05। যে অভিব্যক্তিটি কাজ করে তা হল's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
ক্ষিতাইজ শর্মা

4
এটিকে হার্ড-কোড করে ঠিক দুই অঙ্কে। এরকম কিছু sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'আরও সাধারণ হবে। (আমি আপনার sedসমর্থন \?শূন্য বা এক ঘটনার জন্য অনুমান করি ))
ট্রিপলি

আরও দেখুন stackoverflow.com/a/48898886/874188 কিভাবে বিভিন্ন অন্যান্য সাধারণ পার্ল মত পালাতে প্রতিস্থাপন জন্য \w, \sইত্যাদি
tripleee

102

কিভাবে ব্যবহার সম্পর্কে grep -E?

echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'

4
+1 এটি সহজ, এবং একই লাইনে একাধিক ম্যাচের ক্ষেত্রে সঠিকভাবে পরিচালনা করবে। এই ক্ষেত্রে একটি জটিল sedস্ক্রিপ্ট তৈরি করা যেতে পারে, তবে কেন বিরক্ত করবেন?
ট্রিপলি

egrepব্যবহারসমূহ বাড়ানো regexp, sedএবং grepমান regexp ব্যবহার করে, egrepবা grep -eবা sed -Eবর্ধিত regexp ব্যবহার করুন, এবং প্রশ্নে পাইথন কোড PCRE ব্যবহার করে, (সাধারণ রেগুলার এক্সপ্রেশন Perl) গনুহ, grep সঙ্গে PCRE ব্যবহার করতে পারেন -Pবিকল্প।
ফিলিপ বুসকিওনি

@FelipeBuccioni আসলে যে হওয়া উচিত egrepবা grep -Eবাsed -r
SensorSmith

একটি একক (প্রথম) ম্যাচের জন্য `| যোগ করুন। | হেড -1` (ব্যাকটিক্স ছাড়াই), অন্য প্রশ্নের এই উত্তর অনুসারে
সেন্সর স্মিথ

4
grepহয়েছে -m 1প্রথম খেলা শেষে থামাতে।
ট্রিপল

5

sedচিনতে পারছে না \d, [[:digit:]]পরিবর্তে ব্যবহার করুন। আপনাকে পালাতে +বা -rসুইচটি ( -Eওএস এক্সে) ব্যবহার করতে হবে ।

দ্রষ্টব্য যে [0-9]আরবী-হিন্দু সংখ্যাগুলির জন্যও কাজ করে।


চেষ্টা করেছি sed -n '/[0-9]\+G[0-9]\+/p'। এখন এটি কেবল পুরো স্ট্রিংটি প্রিন্ট করে
রানর্যাগ


5

পরিবর্তে এটি চেষ্টা করুন:

echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'

তবে মনে রাখবেন, যদি এক লাইনে দুটি প্যাটার্ন থাকে তবে এটি ২ য় প্রিন্ট করবে।


বা একাধিক ম্যাচ থাকলে সাধারণত শেষটি
ট্রিপলি

0

রিক্সট্র্যাক্ট ব্যবহার করার চেষ্টা করুন । এটি আপনাকে নিয়মিত এক্সপ্রেশন ব্যবহার করে পাঠ্য উত্তোলন করতে এবং পুনরায় ফর্ম্যাট করতে দেয়।

উদাহরণ:

$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'

2G05

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