শেড লাইন থেকে সমস্ত শুরুর প্যাটার্ন ম্যাচগুলি সরিয়ে ফেলুন


11

আমার নিচের লাইনটি রয়েছে:

abababtestab

আমি লাইনের শুরু থেকে sedসমস্ত উপস্থিতি সরিয়ে ফেলতে একটি অভিব্যক্তি বের করার চেষ্টা করছি abযাতে রূপান্তরিত লাইনটি হওয়া উচিত:

testab

আমি মনে করি এটি সহজ হওয়া উচিত, তবে আমি সত্যিকার অর্থে কিছুই জানি না sed

আমার এখন পর্যন্ত যা আছে তা হ'ল:

sed 's/^ab//'

তবে এটি কেবল আবের প্রথম ঘটনাটি সরিয়ে দেয়।

উত্তর:


16
sed 's/^\(ab\)*//' <in >out

আপনার এটি গ্রুপ করা উচিত।

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

কিছু পুরোনো sedগুলি যে হ্যান্ডেল করতে পারেন না খুব ভাল, যদিও। যদিও সাব-এক্সপ্রেশন সদৃশটি BRE এর একটি পসিক্স-নির্দিষ্ট বৈশিষ্ট্য, কিছু লোক sedএটি সঠিকভাবে সমর্থন করে না। এর মধ্যে কিছুতে, যদিও ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... পরিবর্তে কাজ করতে পারে।


ঠিক কী আমি ধন্যবাদ খুঁজছিলাম! (একবার আমাকে এটির অনুমতি দেওয়ার পরে আমি চিহ্নিত করব)
ড্যান

এমনকি sedপ্রায় 1979 এর 7 ম সংস্করণ এটি সমর্থন করেছিল। গ্রুপিং পরিচালনা না করার জন্য এটি নিকৃষ্ট অনুকরণ হতে হবে।
জোনাথন লেফলার

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

@ জোনাথনলফলার: এটি হেরলুম সরঞ্জামচেটের সিড সংস্করণেও কাজ করে না।
cuonglm

@ কুওগলম - \(ab\)\1*সংস্করণ ডাব্লু / ডিফল্ট উত্তরাধিকারী sedএবং \(ab\)*সংস্করণ ডাব্লু / এসওএসভি 4 উত্তরাধিকার কাজ করে sed। কমপক্ষে, এটি আমার বিল্ডের জন্য করে। স্বীকার করা যায় যে, আমি আমার উত্তরাধিকার সূত্রটি musl lib C এর বিপরীতে তৈরি করেছি এবং তাই আমি ভাবতে পারি যে এটির কারণে এটি অন্যরকম আচরণ করতে পারে। তবে সাধারণত যখন কোনও নির্দিষ্ট বৈশিষ্ট্য একটি উত্তরাধিকারী SuSv4 উত্তরাধিকার সরঞ্জামে কাজ করে তবে ডিফল্ট সরঞ্জামে না, কারণ এটি এটি তৈরি করেছিল।
মাইকজার্ভ

6

আরেকটি sed:

sed -e ':1' -e 's/^ab//;t1'

প্রতিটি ইনপুট লাইন দিয়ে, আমরা একটি লেবেল সেট আপ করি :1, তারপরে লাইনের শুরুতে sঅবনতি করি ab। যদি sসফলভাবে অবরুদ্ধকরণ হয়, tলেবেল কমান্ড শাখা আছে 1, abলাইনের শুরুতে কোনও প্যাটার্ন উপস্থিত না হওয়া অবধি কাজটি আবার করুন done


আমার চিন্তা ঠিক. কঠোরভাবে, আপনাকে পরীক্ষা করার দরকার নেই: s/^ab//; t1যথেষ্ট
গ্লেন জ্যাকম্যান

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