মেলানো নয় এমন লাইনগুলিকে উপেক্ষা করুন


94

আমি sedকিছু অভিব্যক্তি অনুসারে ফিল্টার মেলানো লাইনগুলি কীভাবে তৈরি করতে পারি , তবে না মিলে যাওয়া লাইনগুলিকে মুদ্রণ করার পরিবর্তে তা উপেক্ষা করব?

প্রকৃত উদাহরণ হিসাবে, আমি scalacফাইলের একটি সেটে (স্কালা সংকলক) চালাতে চাই এবং তৈরি করা ফাইলগুলি এর -verboseআউটপুট থেকে পড়তে চাই .classscalac -verboseবার্তাগুলির একগুচ্ছ ফলাফল দেয়, তবে আমরা কেবল ফর্মটির মধ্যে আগ্রহী [wrote some-class-name.class]। আমি বর্তমানে যা করছি তা হ'ল ( |&পরবর্তী প্রোগ্রামটিতে স্ট্যাডারকে পাইপ দেওয়ার জন্য বাশ 4.0 এর উপায়):

$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'

এটি আমাদের আগ্রহী বার্তাগুলি থেকে ফাইলের নামগুলি বের করে দেবে, তবে অন্য সমস্ত বার্তাগুলিও অপরিবর্তিত অবস্থায় দিয়ে যেতে দেবে! অবশ্যই আমরা এর পরিবর্তে এটি করতে পারি:

$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
  sed 's/^\[wrote \(.*\.class\)\]$/\1/'

যা কাজ করে তবে দেখতে অনেকটা বাস্তব সমস্যা ঘুরে দেখার মতো, যা কীভাবে sedইনপুট থেকে অ-ম্যাচিং লাইনগুলিকে উপেক্ষা করার নির্দেশ দেয়। তাই কিভাবে আমরা তা করতে পারি?


4
: গৃহীত উত্তর mouviciel পর এক হওয়া উচিত stackoverflow.com/a/1665574/869951
অলিভার

উত্তর:


90

প্লেইন সেডের সাথে অন্য একটি উপায়:

sed -e 's/.../.../;t;d'

s///একটি বিকল্প, tকোনও লেবেল ছাড়াই শর্তাধীন নিম্নলিখিত কমান্ডগুলি এড়িয়ে যায়, dলাইন মুছে দেয়।

পার্ল বা গ্রেপের দরকার নেই।

(নিকোলাস রিলির পরামর্শের পরে সম্পাদিত)


4
ওএস এক্স ১০.৮.২-তে আমাকে যেভাবে অর্ধেকোলন পেয়ে যাচ্ছিল তার পরিবর্তে আমাকে আলাদা করতে হবে txএবং dএকটি নতুন লাইনও পড়তে হয়েছিল undefined label 'x;d;:x'
ডেভিডচাম্বার

6
আরও ভাল: sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'( অনুরূপ প্রশ্নের মন্তব্যে প্রস্তাবিত )।
ডেভিডচেম্বার

4
'T' স্ক্রিপ্ট শেষে, তাই সহজ যদি কোনো ট্যাগ সরবরাহ করা হয় হস্তান্তর করবে: sed -e 's/.../.../' -e 't' -e 'd'
নিকোলাস রিলে

লোকেরা -eবিকল্পটির অর্থ জানেন না তাই সাধারণভাবে এটি সম্পর্কে উল্লেখ করবেন না।
ফ্রেড্রিক গাউস

246

আপনি যদি মেলে না এমন লাইনগুলি মুদ্রণ করতে না চান, আপনি এর সংমিশ্রণটি ব্যবহার করতে পারেন

  • -n অপশন যা সেড প্রিন্ট না করতে বলে
  • p পতাকা যা সেলে মিলে যা মুদ্রণ করতে বলে

এটি দেয়:

sed -n 's/.../.../p'

4
এই পদ্ধতির একটি নেতিবাচক দিকটি হ'ল যদি আপনার একাধিক এক্সপ্রেশন মেলে তবে ফলটিও একাধিকবার মুদ্রিত হবে। উদাহরণস্বরূপ: echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'উভয় barএবং oofপৃথক লাইন আউটপুট হবে । যদিও গোটো-লেবেলটি একাধিক নিদর্শন পরিচালনা করতে পারে না কারণ এটি প্রথম প্যাটার্নটি মেলে না তবে এটি লাইনটি মুছে ফেলবে।
রাপসে

@ রাপসে এটি কারণ আপনি এটি দু'বার মুদ্রণ করতে বলছেন। একক সেড কমান্ডে আপনি এটি দু'বার মুদ্রণ করতে বলেছিলেন, প্রতিটি উদাহরণ সিট-ইন (সিজনে বা সম্ভবত বাফার) মুদ্রিত হবে। আপনাকে হয় -e এর পরিবর্তে পাইপ করতে হবে অথবা কেবল সর্বশেষ -e-তে 'পি' লাগাতে হবে।
মাইক্রোবিয়াল

@ রাপসি: এই প্রাসঙ্গিক
বিষয়টির

@ মাইক্রোবায়াল, এটি কাজ করবে না যেহেতু সর্বশেষ প্রতিস্থাপনের অভিব্যক্তি দ্বারা শেষের পতাকাটি প্রতিটি মিলিত লাইনে কাজ করবে ।
আমেসিহেল


0

একাধিক বিকল্পের অভিব্যক্তি সম্পর্কে রাপসি একটি প্রাসঙ্গিক বক্তব্য উত্থাপন করেছিলেন।

  • প্রথমে, ইউনিক্স এসই উত্তরটি উদ্ধৃত করে , আপনি "বেশিরভাগ সেড কমান্ডগুলিকে একটি ঠিকানা দিয়ে প্রিফিক্স করতে পারেন যাতে তারা যে রেখাগুলি প্রয়োগ করে সেগুলি সীমাবদ্ধ করে"।
  • দ্বিতীয়ত, আপনি কোঁকড়া ধনুর্বন্ধনী মধ্যে কমান্ড গোষ্ঠী করতে পারেন {}(একটি অর্ধ-কোলন ;বা একটি নতুন লাইন দিয়ে পৃথক )
  • তৃতীয়, শেষ প্রতিস্থাপনে মুদ্রণ পতাকা পি যোগ করুন

বাক্য গঠন:

sed -n -e '/^given_regexp/ {s/regexp1/replacement1/flags1;[...];s/regexp1/replacement1/flagsnp}'

উদাহরণ ( আরও তথ্যের জন্য এখানে ডকুমেন্ট দেখুন):

  • কোড:

    sed -n -e '/^ha/ {s/h/k/gp;s/a/e/g}' <<SAMPLE
    haha
    hihi
    SAMPLE
    
  • ফলাফল:

    kaka
    

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