সেড: প্রথমটি বাদ দিয়ে একটি স্ট্রিংয়ের সমস্ত উপস্থিতি মুছুন


14

এটিতে টাইমস্ট্যাম্প সহ আমার একটি লগফিল আছে। মাঝে মাঝে এক লাইনে একাধিক টাইমস্ট্যাম্প থাকে। এখন আমি একটি টাইম থেকে সমস্ত টাইমস্ট্যাম্পগুলি সরিয়ে ফেলতে চাই তবে প্রথমটি রাখি।

আমি করতে পারি s/pattern//2তবে এটি কেবল দ্বিতীয় ঘটনাটি সরিয়ে sedদেয় এবং এর মতো কিছুকে অনুমতি দেয় না s/pattern//2-

কোনও পরামর্শ?


আমার বলা উচিত ছিল যে এটি ব্যস্তবক্সের কাজ। তার জন্য দুঃখিত।
ফোকর্ট ভ্যান হিউসডেন

উত্তর:


4

জিএনইউ সহ sed:

sed 's/pattern//2g'

2নির্দিষ্ট করে দ্বিতীয় প্যাটার্ন এবং বাকি সব gমুছে ফেলা আবশ্যক। সুতরাং এটি প্রথম রাখবে।


1
যা সাইগউইনের রয়েছে (দৃশ্যত একটি বন্দর) এবং ম্যাকওএস নেই। Achh! এই সমাধানটি আরও অনেক মার্জিত।
r_alex_hall

7

এটি কাজ করা উচিত (এটির লগগুলির সাথে সংঘর্ষ হওয়া উচিত অন্য কোনও কিছুর পরিবর্তে _):

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

1
আপনি যদি কখনও কোনও অনন্য সীমানা চান, ব্যবহার করুন \n
মাইকজার্ভ

5
sed -e ':begin;s/pattern//2;t begin'

বা সেড গোটো ছাড়া:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

নবম (3 উদাহরণস্বরূপ) অবস্থান থেকে সরানোর জেনেরিক সমাধানগুলি হ'ল:

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

1

@ জিলাগ্রের উত্তরের ( মজবুততার জন্য সংশোধিত) সামান্য পরিবর্তনের মতো দেখতে পাওয়া যেতে পারে:

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

... তবে কিছু কিছু ক্ষেত্রে sedআপনাকে nপ্রথমে s///ubstistance স্টেটমেন্টের ডান-হাতের একটি আক্ষরিক \nইওলাইন চরিত্রের সাথে প্রতিস্থাপনের প্রয়োজন হতে পারে ।

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