সেড: কেবল মেলানো গ্রুপ মুদ্রণ করুন


133

আমি শেষ দুটি সংখ্যা (একটি অন্তর্নিহিত, এক ভাসা; followedচ্ছিক সাদা স্থান অনুসরণ করে) ধরতে চাই এবং কেবল সেগুলি মুদ্রণ করতে চাই।

উদাহরণ:

foo bar <foo> bla 1 2 3.4

মুদ্রণ করা উচিত:

2 3.4

এখনও পর্যন্ত, আমি নিম্নলিখিত:

sed -n  's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p' 

আমাকে দেবে

foo bar <foo> bla 1 replacement

তবে, আমি যদি গ্রুপ 1 এর সাথে এটি প্রতিস্থাপন করার চেষ্টা করি তবে পুরো লাইনটি মুদ্রিত হবে।

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

আমি কীভাবে কেবলমাত্র লাইনের কেবল বিভাগটি প্রিন্ট করতে পারি যা গ্রুপে রেজেক্সের সাথে মেলে?

উত্তর:


138

পুরো লাইনটি .*মিলিয়ে দেখুন , তাই আপনার রেগেক্সের শুরুতে একটি যুক্ত করুন । এর ফলে গোটা লাইনটিকে গ্রুপের বিষয়বস্তুগুলির সাথে প্রতিস্থাপন করা হয়

echo "foo bar <foo> bla 1 2 3.4" |
 sed -n  's/.*\([0-9][0-9]*[\ \t][0-9.]*[ \t]*$\)/\1/p'
2 3.4

38
আমাকে -rবা `--regexp -سیع` বিকল্পটি যুক্ত করতে হবে অন্যথায় আমি invalid reference \1 on s 'কমান্ডের আরএইচএস `ত্রুটি পাচ্ছিলাম ।
ড্যানিয়েল সোকলভস্কি

15
@DanielSokolowski আমি আপনি যে ভুল পান যদি আপনি ব্যবহার মনে (এবং )পরিবর্তে \(এবং \)
ড্যানিয়েল দারাবস

3
.*আপনি যে স্ট্রিংটি উত্তোলন করতে চান তা যদি সর্বদা লাইনটির শেষে না থাকে তবে রেজিপেক্সের শেষে যুক্ত করতেও মনে রাখবেন ।
তিমু লেইস্তি

3
এটি আমার পক্ষে কাজ করবে না কারণ .*লোভী এবং .*?
সেডের কোনও

@ ড্যানিয়েলডারাবোস কেবল এটি উল্লেখ করুন (এবং )উবুন্টু 16.04 এ ত্রুটি বাড়িয়ে তুলবেন না। সুতরাং আমি মনে করি এই মন্তব্যটি পুরানো।
লি হোনান

72

নিষ্কর্ষের জন্য গ্রেপ হ'ল সঠিক সরঞ্জাম।

আপনার উদাহরণ এবং আপনার রেজেক্স ব্যবহার করে:

kent$  echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$'
2 3.4

12
পুরো গোষ্ঠীর জন্য দুর্দান্ত, যদিও পৃথক গোষ্ঠীগুলির জন্য
সেডের

গ্রেপ -o এমএসএসজিট চলমান সিস্টেমে পোর্ট করে না তবে সেড করে।
চেম্বারলাইন

এটিকে গ্রেপের সাহায্যে সমাধান করার জন্য লুক-ফরোয়ার্ড এবং লুক-পিছনে ব্যবহার করা এমন একটি উত্তরের জন্য @ জোজক্সিএককে যুক্ত লিঙ্কিত প্রশ্নটি দেখুন।
জোচিম ব্রেটনার

আপনি পাইপযুক্ত grep -oকলগুলি সহ কোনও প্যাটার্ন থেকে একটি দল বের করতে পারেন । stackoverflow.com/a/58314379/117471
ব্রুনো Bronosky

12

এবং আরও একটি বিকল্পের জন্য, আমি জোর দিয়ে যাব!

echo "foo bar <foo> bla 1 2 3.4" | awk '{ print $(NF-1), $NF; }'

এটি ইনপুটকে বিভক্ত করবে (আমি এখানে এসটিডিন ব্যবহার করছি তবে আপনার ইনপুটটি সহজেই একটি ফাইল হতে পারে) ফাঁকা জায়গায় এবং তারপরে শেষ-তবে-এক ক্ষেত্রটি এবং তারপরে শেষ ক্ষেত্রটি প্রিন্ট করুন। $NFভেরিয়েবল রাখা ক্ষেত্র সংখ্যা শূণ্যস্থান উপর ফাটিয়ে পর খুঁজে পাওয়া যায়নি।

এর সুবিধাটি হ'ল শেষ দুটি ক্ষেত্রের পূর্বেরগুলির আগে যা পরিবর্তন হয় তা বিবেচ্য নয়, যতক্ষণ আপনি কেবল সর্বশেষ দুটি চান তা কাজ করে চালিয়ে যাবে।


3

কাট কমান্ড এই সঠিক পরিস্থিতির জন্য ডিজাইন করা হয়েছে। এটি যে কোনও ডিলিমিটারে "কাটা" হবে এবং তারপরে আপনি নির্দিষ্ট করতে পারবেন কোন অংশগুলি আউটপুট হবে।

এই ক্ষেত্রে: echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7

এর ফলাফলের ফলস্বরূপ: 2 3.4

-d ডিলিমিটার সেট করে

-f আউটপুট পর্যন্ত 'ক্ষেত্র' এর ব্যাপ্তি নির্বাচন করে, এক্ষেত্রে এটি মূল স্ট্রিংয়ের 7th ষ্ঠ অংশের মধ্যে 6th আপনি তালিকা হিসাবে পরিসীমাটি নির্দিষ্ট করতে পারেন, যেমন 6,7


একমাত্র নির্দিষ্ট কলাম, নল মুদ্রণ করতেawk '{ print $2" "$6 }'
nurettin

@ নুরেটিন আমি মনে করি আপনার মন্তব্যটি সম্ভবত উত্তরগুলির একটির জন্য বোঝানো হয়েছিল।
carlin.scott

আমি যখন এই পৃষ্ঠাটি পরিদর্শন করেছি তখন এটির সীমাবদ্ধতাগুলি অনুধাবন করার চেষ্টা করেছি এবং এই পোস্টের গুণমান উন্নত করার জন্য মন্তব্য হিসাবে পরিবর্তে আরও কিছু সাধারণ সংস্করণ লিখব।
নুরেটিন

1
হ্যাঁ, আমি মনে করি এটি awk জড়িত একটি পৃথক উত্তরের সাথে সম্পর্কিত। আপনি যা লিখেছেন তা করার জন্য কাট কমান্ডটি হ'ল:cut -d " " -f 2,6
carlin.scott

আহ, আমি জানতাম না, আমি ভেবেছিলাম আপনি কেবল রেঞ্জ দিতে পারবেন। তার জন্য ধন্যবাদ.
নুরেটিন

2

আমি @ কেন্টের সাথে একমত যে এটি উপযুক্ত grep -o। আপনার যদি কোনও প্যাটার্নের মধ্যে কোনও গ্রুপ উত্তোলনের প্রয়োজন হয় তবে আপনি এটি ২ য় গ্রেপ দিয়ে করতে পারেন।

# To extract \1 from /xx([0-9]+)yy/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'xx[0-9]+yy' | grep -Eo '[0-9]+'
123
4

# To extract \1 from /a([0-9]+)b/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'a[0-9]+b' | grep -Eo '[0-9]+'
678
9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.