sed: অন্য স্ট্রিং প্রথম সংঘটিত হওয়া পর্যন্ত একটি স্ট্রিং মধ্যে টেক্সট মুছে দিন


4

অনুমান করুন আমার নিম্নলিখিত পাঠ্যটি মত কিছু আছে:

দ্রুত বাদামী শিয়াল 2012 এবং 2013 মধ্যে জাম্প

এবং আমি চার নম্বর সহ "ফক্স" থেকে অংশটি মুছে ফেলতে চাই তবে শুধুমাত্র প্রথম ঘটনার সাথে আমি শেষ করব:

দ্রুত বাদামী এবং 2013

কিছু ভালো লেগেছে ...:

echo "The quick brown fox jumps in 2012 and 2013" \
   | sed  "s/fox.*\([0-9]\{4\}\)//g"

... আমাকে এনেছে:

The quick brown

সুতরাং চারটি সংখ্যার শেষ ঘটনা সহ সবকিছু সরিয়ে ফেলা হয়েছে।

কোন ধারনা?


রেগুলার এক্সপ্রেশনগুলিতে স্ট্যান্ডার্ড কোয়ান্টিফায়ার লোভী, যার অর্থ তারা যতটা সম্ভব মিলবে।
kinokijuf

উত্তর:


6

POSIX নিয়মিত এক্সপ্রেশন দ্বারা ব্যবহৃত sed ("মৌলিক" এবং "বর্ধিত" উভয় সংস্করণ) অ লোভী মিল সমর্থন করে না। (যদিও ব্যবহার করার মতো কিছু কার্যকারিতা আছে [^0-9]* জায়গায় .*, ইনপুট অনেক পরিবর্তিত হলে তারা অবিশ্বস্ত হয়ে।)

আপনি প্রয়োজন ব্যবহার করে পার্ল মধ্যে কি অর্জন করা যেতে পারে ? অ লোভী কোয়ান্টিফায়ার:

echo "The quick brown fox jumps in 2012 and 2013" \
   | perl -pe 's/fox.*?([0-9]{4})//g'

আপনি পাশাপাশি একটি অতিরিক্ত স্থান মুছে ফেলতে চান।


এটা না, আউটninja'd। অতিরিক্ত স্থান সম্পর্কে কি, যদিও? (+1 টি)
grawity

@ গরু: ডান বন্ধনী পরে একটি স্থান যোগ করার চেষ্টা করুন।
choroba

বন্ধনী কি দরকারী?
Scott

@ স্কট: এই ক্ষেত্রে সত্যিই না :-)
choroba

1

আপনি ব্যবহার করতে চান অনুমান কেবল sed এবং আপনি চান যে সংখ্যাটির প্রথম গোষ্ঠী হ'ল সংখ্যাটির পরে শব্দটি কী না তা বিবেচনা না করে, এটি কাজ করে:

echo "The quick brown fox jumps in 2012 and 2013" \
   | sed "s/fox[^0-9][^0-9]*[0-9][0-9]* //"

প্যাটার্ন মিলিত করে কাজ করে fox, এক বা একাধিক অ-সংখ্যা অনুসরণ করে [^0-9][^0-9]*, 1 বা তার বেশি সংখ্যা অনুসরণ করে [0-9][0-9]*। এই প্যাটার্নটি অনির্বাচিত সংখ্যক সংখ্যার সাথে কাজ করবে, মাত্র 4 নয়। আপনি যদি ঠিক 4 টি সংখ্যা মিলতে চান তবে এটিকে এতে পরিবর্তন করুন:

echo "The quick brown fox jumps in 2012 and 2013" \
   | sed "s/fox[^0-9]*\([0-9]\{4\}\) //"

1

আপনি নির্দিষ্ট না ঠিক আপনার প্রয়োজনীয়তা কি। আপনি একটি মাল্টি ধাপ প্রক্রিয়া করতে পারেন। আপনি যে স্ট্রিংটি জানেন তা আপনার ইনপুটে উপস্থিত হবে না (উদাঃ, #### ):

echo "The quick brown fox jumps over 42 lazy dogs in 2012 and 2013." \
  | sed \
        -e "s/[0-9]\{4\}/###/" \
        -e "s/fox.*####//" \
        -e "s/####//"

(কমান্ড অত্যধিক readability জন্য folded।) -e "s/[0-9]\{4\}/&####/" উদ্বুদ্ধ #### পরে প্রথম চার অঙ্কের সংখ্যা। (সতর্কতা: এই পরিবর্তন হবে 65536 থেকে 6553####6।)
-e "s/fox.*####//" ধারণকারী লাইন প্রভাবিত করে fox এবং #### - যেমন, লাইনগুলির মধ্যে অন্তত একটি চার-সংখ্যার নম্বর থাকে - এবং তারপর থেকে মুছে ফেলা হয় fox মাধ্যমে প্রথম চার অঙ্কের সংখ্যা।
-e "s/####//", অবশ্যই, কোনও পরিষ্কার #### স্ট্রিং যা চারটি সংখ্যার নম্বর থাকা সত্ত্বেও ছেড়ে দেওয়া হয় তবে নয় fox

যদি এক নম্বর নম্বরের পরে একটি স্থান সরাও,

echo "The quick brown fox jumps over 42 lazy dogs in 2012 and 2013." \
  | sed \
        -e "s/[0-9]\{4\}/###/" \
        -e "s/fox.*#### //" \
        -e "s/fox.*####//" \
        -e "s/####//"

সতর্কতা: আপনি যোগ করতে পারেন g সব থেকে s কমান্ড, কিন্তু, এই এখনও ব্যবহার করে .*, যা আপনার সমস্যা মূল, এটি এখনও হ্যান্ডেল করা হবে না

One fox jumps in 2012 and 2013, another fox will jump in 2014 and 2015.

সম্ভবত আপনি চান উপায়। এবং, অবশ্যই, আপনি না যোগ করতে চান g থেকে "s/[0-9]\{4\}/&####/" কারণ তারপর এটি ইনজেকশন হবে #### পরে প্রতি পুরো পয়েন্ট পরাজিত, চার অঙ্ক সংখ্যা। এরপর "s/fox.*####//" শুধু মত অভিনয় শেষ হবে "s/fox.*[0-9]\{4\}//" (অ-অবদানকারী অক্ষরগুলি সহ আপনার মূল কমান্ডটি সরানো হয়েছে); যেমন, এটি পরিবর্তন হবে

দ্রুত বাদামী শিয়াল 2012 এবং 2013 মধ্যে জাম্প।

থেকে

২01২ #### এবং ২013 #### এ দ্রুত বাদামী শিয়াল ঝাঁপিয়ে পড়ে।

এবং তারপর

দ্রুত বাদামী।

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