আমরা কি লিনাক্সের প্রতিটি লাইনের শেষ শব্দটি সেড কমান্ড ব্যবহার করে মুদ্রণ করতে পারি?


9

মনে করুন, নিম্নলিখিত ফাইলগুলি সমন্বিত যদি কোনও ফাইল থাকে তবে সেগুলি রয়েছে

12345 567 7878 66

   er3 t45t y6y46y 


 4y6 y656y y5y

   46y6 65y7 y66uyuy

 yy46y6y

ফলাফলটি দেখতে হবে:

66

y6y46y

y5y

y66uyuyy

y46y6y

কমান্ড sed 's/.* //g'ফাইলের নাম এবং অন্যান্য বেশ কয়েকটি কমান্ড চেষ্টা করেছি sed, কিন্তু এটি কাজ করছে না।

আমি জানতে পারি সঠিক sedআদেশটি কী?


এটি ব্যবহার করা আবশ্যক sed?
coffeMug

উত্তর:


8
awk '{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//'

এটি এখনও প্রতিটি ফাঁকা লাইনের জন্য একটি খালি রেখা মুদ্রণ করবে। এড়াতে:

awk 'NF{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//;/./!d'

একক অভিব্যক্তি বিকল্প: sed -n 's/.*[[:blank:]]\+\([^[:blank:]]\+\)[[:blank:]]*$/\1/p'
jimmij

@ জিম্মিজ - শেষটি ফাঁকা সিকোয়েন্সটিও যদি প্রথম হয় এবং এর আগে কোনও ফাঁকা স্থান না থাকে তবে এটি কাজ করে না। এছাড়াও, আপনি সম্ভবত কেবল .*লেজ এ করতে পারেন, সম্ভবত - আপনি যাই হোক না কেন ফাঁকা পিছনে ছাড়া কিছু অস্বীকার w / .*[^[:blank:]]
মাইক্রজারভের



4

আপনি বেশিরভাগ ওখানেই থাকেন. শুধু শেষ শব্দটি নির্দিষ্ট করুন:

sed 's/^.* \([^ ][^ ]*\)/\1/g'

এর মানে কি:

  1. '^। *' লাইনটির শুরুতে এবং যে কোনও স্পেসের মধ্যে সমস্ত কিছু মুছে দেয়।
  2. '\ (...) \' একটি প্যাটার্নের সাথে মেলে এবং এটিকে \ 1 হিসাবে ফিরিয়ে দেয়।
  3. '[^]' এতে কোনও স্থান ছাড়াই কোনও কিছুর সাথে মেলে।

(আরও ভাল সমাধান যুক্ত করতে সম্পাদিত Thanks ধন্যবাদ হিলড্রেড!)


1
এখানে একটি সংক্ষিপ্ত প্রকাশ: sed -r 's/.* ([^ ]+)/\1/g'বর্ধিত নিয়মিত প্রকাশের অনুমতি দেওয়া হয় যা সাধারণত ক্ষেত্রে হয়।
এমকালকো

সংক্ষিপ্ত সংস্করণ, আপনি কী রাখতে চান না তার পরিবর্তে আপনি যা রাখতে চান তা ব্যবহার করে:sed 's/.* //'
ইউরিয়েল

2

আপনি এর grepপরিবর্তে কিছু পর্যাপ্ত প্যাটার্ন ব্যবহার করতে পারেন sed, উদাহরণস্বরূপ:

grep -o "[a-Z0-9]*$"

এই উদাহরণে, [...]"শব্দের" জন্য উপযুক্ত বলে মনে করা অক্ষরের ব্যাপ্তি রয়েছে (এই ক্ষেত্রে বর্ণমালা, অন্যান্য চিহ্নগুলি যুক্ত করা যেতে পারে, যার কয়েকটি অবশ্যই অব্যাহতিপ্রাপ্ত হতে হবে)।


3
এটি ধরে নিয়েছে যে লাইনের শেষে কোনও ফাঁকা নেই। a-Zএকটি পরিসীমা যেমন তেমন কোনও তাত্পর্যপূর্ণ করে না, এমনকি ASCII- ভিত্তিক লোকালগুলিতেও। নোট যে -oএকটি GNU এক্সটেনশান।
স্টাফেন চেজেলাস

0

আপনি যদি 1 বা ততোধিক অবৈধ অক্ষরের কোনও ক্রমকে বোঝাতে শব্দটিকে যোগ্য করে থাকেন তবে উত্তরটি অবশ্যই হ্যাঁ, এবং এটি খুব সহজভাবে করা হয়েছে। এটি কারণ এবং এটি বুলিয়ান পরিপূরক এবং - স্ট্রিংয়ের সমস্ত অক্ষর সম্পূর্ণ হয়ে থাকে - ইউ কোনও সম্ভাব্য স্ট্রিংকে একইভাবে বর্ণনা করতে পারে।[[:blank:]]*[^[:blank:]]*[[:blank:]]*[^[:blank:]]*.*

যদি কোনও অসম্পূর্ণ অক্ষর বা অন্যথায় অবৈধ বাইট সিকোয়েন্সটি কোনও স্ট্রিংয়ের মধ্যে উপস্থিত থাকে তবে তা সফলভাবে এটিকে মাথা থেকে লেজ পর্যন্ত বর্ণনা করতে পারে না - কখনও কখনও ভুল এনকোডিংয়ের সাথে স্ট্রিংয়ের ব্যাখ্যা দেওয়ার সময় ঘটতে পারে। যে কোনও স্ট্রিংয়ে বাইট প্রতি সম্পূর্ণ অক্ষর নিশ্চিত করতে, সি লোকেলকে এইভাবে বাধ্য করা যেতে পারে:

LC_ALL=C sed ...

... যা মাথা থেকে লেজ পর্যন্ত স্ট্রিংয়ের বর্ণন সম্পর্কিত কোনও সমস্যা এড়াতে পারে যেমন .*বা সমস্ত-সমেত প্যাটার্ন সহ or([ ]*[^ ]*)*

পুরোপুরি পরিপূরক নিদর্শনটি প্যাটার্নটির কোনও বিরতি ছাড়াই শেষ সম্ভাব্য ঘটনার উপর বাম থেকে ডানদিকে যে কোনও স্ট্রিংয়ের দৈর্ঘ্য অবতরণের জন্য প্রয়োজনীয় যতবার পুনরাবৃত্তি করতে পারে। এটি অবশ্যই, নিয়মিত ভাষা।

BRE:

sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'

ere:

sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'

এই উভয় সংস্করণ এখনও ফাঁকা রেখা মুদ্রণ করবে এবং এটি কারণ ক্লিন *তারকা একটি প্যাটার্নের শূন্য বা তার বেশি সংখ্যার সাথে মেলে। এটি প্রথমে শূন্য বা আরও বেশি ফাঁকা অক্ষর নয়, তারপরে শূন্য বা আরও ফাঁকা অক্ষর, তারপরে শূন্য বা আরও বেশি সংঘবদ্ধ হওয়া ম্যাচগুলি না হওয়া পর্যন্ত এটি পুরোপুরি স্ট্রিংয়ের সাথে মেলে না।

এই সমস্তটির সাথে মিলে যাওয়ার পরে, ম্যাজিকটি প্রতিস্থাপনে ঘটে - রেফারেন্সগুলি গোষ্ঠীগুলির দ্বারা ফিরে আসে \1এবং \2এটি প্রতিটিটির সর্বশেষ ঘটনা। সুতরাং প্রতিস্থাপনটি তৈরি করা হলে সমস্ত স্ট্রিং শূন্য অক্ষরের লাইনে কেবল শেষ ঘটনাটি বা আরও ফাঁকা অক্ষর নয় - বা উপগোষ্ঠীর সাথে প্রতিস্থাপন করা হয় \2

অবশ্যই এটি কোনও সম্ভাব্য স্ট্রিংয়ের জন্য কাজ করে - এমনকি একটি খালিও - যার অর্থ উভয় ফর্ম লাইনগুলির জন্য নিউলাইন অক্ষরগুলি মুদ্রণ করবে যা কেবল ফাঁকা অক্ষর বা মোটেও কিছুই নয়। এটি পরিচালনা করতে আপনি করতে পারেন এমন কয়েকটি জিনিস রয়েছে তবে প্রথমে অক্ষর শ্রেণিটি টাইপ করা একটু সহজ করে তুলুন:

b='[:blank:]'

এখন, কেবল যদি মুদ্রণ করতে কোনও লাইনে এক বা একাধিক ফাঁকা অক্ষর থাকে তবে আপনি করতে পারেন:

BRE:

sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"

ere:

sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
  1. বিআরই কেস - প্রতিস্থাপন সর্বদা সঞ্চালিত হয় এবং কমপক্ষে একটি অক্ষর বিশিষ্ট কেবলমাত্র প্যাটার্ন স্পেসগুলি মুদ্রিত হয়।
  2. পূর্ববর্তী ক্ষেত্রে - প্রতিস্থাপনটি কেবলমাত্র কোনও প্যাটার্ন স্পেসে চেষ্টা করা হয় যেখানে কমপক্ষে একটি ফাঁকা চর থাকে না।

উভয়ই ফর্ম উভয় পদ্ধতির সাথে কাজ করবে - যতক্ষণ না সিনট্যাক্স সঠিক হয়।

-nসুইচ অক্ষম স্বয়ংক্রিয় মুদ্রণ প্যাটার্ন স্থান, এবং pপতাকা s///ubstitution বা /ঠিকানা /কমান্ড এর ফলাফলের শুধুমাত্র যদি সফল ছাপে।

এই একই যুক্তিটি যে কোনও {num}সংঘটিত হওয়ার জন্য প্রয়োগ করা যেতে পারে , যেমন:

BRE:

sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"

ere:

sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"

... যেখানে numউভয় রেজেক্সপগুলিকে একটি সংখ্যা দিয়ে প্রতিস্থাপন করা যেতে পারে কেবল {num}ফাঁকা অক্ষরের ক্রম হিসাবে কেবলমাত্র তৃতীয় নির্দিষ্ট ঘটনা মুদ্রণ করতে । একটি স্ট্রিংয়ের শীর্ষস্থানীয় স্থানের জন্য গণনাটি স্কিউড না হয় তা নিশ্চিত করতে এখানে কিছুটা আলাদা ফর্ম ব্যবহার করা হয়।

নোট করুন যে -EERE স্যুইচটি sedBSD এবং GNU উভয় সংস্করণেই সমর্থিত, যদিও এটি এখনও পসিক্স স্ট্যান্ডার্ড সিনট্যাক্স নয়।


সুন্দর ব্যাখ্যা, দুর্দান্ত হ্যাক, তবে মনে রাখবেন এটি traditional sed তিহ্যবাহী বাস্তবায়নের সাথে কাজ করে না (যেমন সোলারিস / ইউএসআর / বিন / সেড) এবং আরও সহজবোধ্য পদ্ধতির চেয়ে বেশি ব্যয়বহুল হয়ে উঠবে (ইনপুট লাইনের সাথে মেমরিকে 25 অক্ষরের বেশি দীর্ঘ করে দেয়) sed_su3উদাহরণস্বরূপ heirloom toolchest থেকে)। সুতরাং, যদিও আমি উত্তরটি পছন্দ করি, তবে আমি সেই পদ্ধতির সুপারিশ করব না।
স্টাফেন চেজেলাস

ফ্রিবিএসডি তেও কাজ করবে বলে মনে হয় না।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস - হ্যাঁ, এই জাতীয় জিনিসের জন্য পারফরম্যান্সটি সত্যই ভয়ঙ্কর, তবে সংখ্যাযুক্ত ঘটনা বাছাইয়ের জন্য এটি খুব কার্যকর হতে পারে। এবং লাইন কেস শেষের জন্য s/.* \([^[:blank:]]\{1,\}\).*/\1/এটি আরও ভাল, তবে একাধিক লাইন জড়িত থাকলে এটি আরও বেশি কঠিন। অন্য দিন, যদিও, আমি আবিষ্কার করেছি 's/\(\n\)*/\1/g;s/\n\(\n.*\)*/&&/[num];s///[samenum]যে বেশ কার্যকরভাবে এটি উপকৃত হতে পারে। যাইহোক, যতক্ষণ না যুক্তিতে কোনও সুস্পষ্ট ত্রুটি নেই তবুও আমি খুশি - আমি কেবল ভেবেছিলাম কিছু অবশ্যই মিস করেছি।
মাইকজার্ভ

@ স্টাফেনচাজেলাস - ওহ, এবং পুরাতন সম্পর্কে sed- এটি কিছুটা অদ্ভুত - এটি স্ট্যান্ডার্ড অনুযায়ী শব্দ করা উচিত। xrat বলছে ... মান ডেভেলপারদের সাধারণ ঐতিহাসিক আচরণ গণ্য, যা সমর্থিত "\n*", কিন্তু না "\n\{min,max\}", "\(...\)*", অথবা "\(...\)\{min,max\}"একটি নির্দিষ্ট প্রয়োগের একটি অ-ইচ্ছাকৃত ফলে, এবং তারা উভয় অনুলিপি এবং subexpressions এবং ব্যাক-রেফারেন্স নিম্নলিখিত বিরতি এক্সপ্রেশন সমর্থিত।
মাইকজার্ভ

@ স্টাফেনচাজলাস - এবং স্ট্যান্ডার্ডটি বলেছে ... যদি ব্যাক-রেফারেন্স দ্বারা সূচিত এক্সপ্রেসনটি যদি একটি নক্ষত্র বা অন্তরবৃত্তের ( '*' )অভিব্যক্তির (আইটেমটি দেখুন (5)) একাধিক স্ট্রিংয়ের সাথে মেলে, তবে ব্যাক-রেফারেন্সটি শেষের সাথে (ডানদিকের সাথে) মিলবে ) এই স্ট্রিং। আমি নিশ্চিত যে আমি এই ডাব্লু / minisedযদিও পরীক্ষা করেছি - অবশ্যই আমি minisedযে কোনও উপায়ে / অন্য দিন পরীক্ষা করছিলাম ।
মাইকজার্ভ

0
sed 's/^ star.star //'  filename  or sed 's/^[[:blank:]]star.star[[:blank:]]//' filename

বিশ্লেষণ:

  • s - বিকল্প

  • / - প্রকাশের জন্য অনুসন্ধান করা

  • ^ - লাইনের শুরু থেকে

  • [[:blank:]]* - ক্ষেত্রে যদি লাইনের শুরুতে ফাঁকা থাকে

  • .* - কোন চরিত্র

  • [[:blank:]] - এবং একটি ফাঁকা চরিত্র

  • / - বিকল্পের মত প্রকাশের শুরু

  • / - কমান্ড সিনট্যাক্সের সমাপ্তি

PS: আমি কমেন্টে তারা লিখেছি।


কীভাবে প্রশ্নে দেওয়া ডেটা প্রয়োগ করা হবে?
কুসালানন্দ

s/.*[[:blank:]]//লাইন শেষে ফাঁকা না থাকলে @ স্কট কাজ করবে।
কুসালানন্দ

-1

হ্যাঁ. নীচের সিড কমান্ডটি প্রথমে সমস্ত ট্রেলিং হোয়াইটস্পেস ( s/ *$//) এবং তারপরে শেষ সাদা স্থান ( s/.* //) সহ সমস্ত কিছু সরিয়ে দেয় । [[:blank:]]ট্যাব এবং অন্যান্য স্থানের মতো অক্ষরগুলি ক্যাপচার করার জন্য এটি সম্ভবত আক্ষরিক শ্বেত স্থানের পরিবর্তে সার্থক is

$ echo "  aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  cc  " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "cc" | sed -e 's/ *$//' -e 's/.* //'
cc

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