ডনের বেশিরভাগ ক্ষেত্রেই ভালো হতে পারে, কিন্তু ধরো যদি ফাইল সত্যিই বড়, এবং আপনি পাবেন না sed
একটি স্ক্রিপ্ট ফাইল বড় যে হ্যান্ডেল করতে (যা স্ক্রিপ্ট প্রায় 5000+ টি লাইন ঘটতে পারে) , এখানে এটা প্লেইন সাথে আছেন sed
:
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
এটি ইনপুটটিতে স্লাইডিং উইন্ডো যাকে বলা হয় তার একটি উদাহরণ । এটি কোনও কিছু মুদ্রণের চেষ্টা করার আগে - অ্যাকাউন্টের লাইনগুলির চেহারা-এগিয়ে বাফার তৈরি করে কাজ করে $B
।
এবং প্রকৃতপক্ষে, সম্ভবত আমার আমার পূর্ববর্তী বিষয়টি স্পষ্ট করা উচিত: এই সমাধান এবং ডনের উভয়ের জন্য প্রাথমিক পারফরম্যান্স সীমাবদ্ধতা সরাসরি বিরতির সাথে সম্পর্কিত হবে। এই সমাধান বৃহত্তর ব্যবধান সঙ্গে মন্থর করে দেবে মাপ , যেহেতু ডনের বড় ব্যবধান সঙ্গে মন্থর করে দেবে ফ্রিকোয়েন্সি । অন্য কথায়, এমনকি যদি ইনপুট ফাইলটি খুব বড় হয় তবে প্রকৃত বিরতি ঘটনা যদি এখনও খুব কম হয় তবে তার সমাধান সম্ভবত যাওয়ার উপায়। তবে, যদি অন্তর আকারটি তুলনামূলকভাবে পরিচালনাযোগ্য হয় এবং প্রায়শই ঘটে যাওয়ার সম্ভাবনা থাকে, তবে এটি আপনার বেছে নেওয়া উচিত সমাধান।
সুতরাং ওয়ার্কফ্লো এখানে:
- যদি
$match
কোনও ই- \n
লাইন এর আগে প্যাটার্ন স্পেসে পাওয়া যায় তবে এর আগে প্রতিটি ইওলাইন sed
পুনরাবৃত্তভাবে একাদশ করতে হবে।
D
\n
- আমি
$match
এর পূর্বে সম্পূর্ণরূপে প্যাটার্নের জায়গাটি সাফ করে দিচ্ছিলাম - তবে সহজেই ওভারল্যাপটি পরিচালনা করতে, একটি ল্যান্ডমার্ক রেখে আরও ভাল কাজ করবে বলে মনে হয়।
- আমি এটি একবারে
s/.*\n.*\($match\)/\1/
পেতে এবং লুপটি ডজ করার চেষ্টা করার চেষ্টাও করেছি , তবে যখন $A/$B
বড় হয়, তখন D
এলেটের লুপটি যথেষ্ট দ্রুত প্রমাণিত হয়।
- তারপর আমরা টেনে
N
একটি পূর্বে ইনপুটের EXT লাইন \n
ewline বিভেদক এবং আবার চেষ্টা করুন D
একটি elete /\n.*$match/
আমাদের অতি সম্প্রতি যেটি ব্যবহার রেগুলার এক্সপ্রেশন W / বিষয়ে উল্লেখ করে আবার //
।
- যদি প্যাটার্ন স্পেসের সাথে মেলে
$match
তবে এটি কেবলমাত্র লাইনের শিরোনামে এটি করতে পারে $match
- সমস্ত $B
ইওরোফর লাইন সাফ হয়ে গেছে।
- সুতরাং আমরা
$A
fter উপর লুপিং শুরু ।
- এই
s///
লুপটির প্রতিটি রান আমরা প্যাটার্ন স্পেসের &
নিজস্ব $A
ই- \n
লাইন চরিত্রটি নিজের জন্য বদলে নেওয়ার চেষ্টা করব এবং সফল হলে এটি t
আমাদের শাখা করে দেবে - এবং আমাদের পুরো $A
অবধি বাফার - পুরোপুরি স্ক্রিপ্টটি উপরের দিক থেকে শুরু করার জন্য পুরোপুরি বাইরে out যদি হয় তবে পরবর্তী ইনপুট লাইন দিয়ে।
- যদি
t
এস্টটি সফল না হয় তবে আমরা b
আবার :t
ওপ লেবেলটিতে ফিরে যাব এবং ইনপুটটির অন্য লাইনটির জন্য পুনরাবৃত্তি করবো - সম্ভবত আরও $match
কিছুটা জড়ো হওয়ার সময় লুপটি শুরু হবে $A
।
- আমরা যদি অতীত একটি পেতে
$match
ফাংশন লুপ, তাহলে আমরা চেষ্টা করব p
দ্রণ $
শেষ লাইনটি যদি এই তা না হয়, আর যদি !
চেষ্টা করবেন s///
জন্য ubstitute &
নিজেই $B
তম \n
প্যাটার্ন স্থান ewline অক্ষর।
- আমরা
t
এটিও করব এবং এটি সফল হলে আমরা :P
রিন্ট লেবেলে শাখা করব ।
- যদি না হয় তবে আমরা ফিরে শাখা করব
:t
এবং বাফারে আর একটি ইনপুট লাইন যুক্ত করব।
- আমরা যদি করতে এটি
:P
দ্রণ আমরা করব P
তারপর দ্রণ D
প্রথম পর্যন্ত elete \n
প্যাটার্ন স্থান ewline দিলে যা থাকে সঙ্গে উপর থেকে স্ক্রিপ্ট পুনরায় আরম্ভ করুন।
এবং তাই এই সময়, যদি আমরা করছিলাম A=2 B=2 match=5; seq 5 | sed...
:P
রিন্টে প্রথম পুনরাবৃত্তির জন্য প্যাটার্ন স্পেসটি দেখতে পাবেন:
^1\n2\n3$
এবং এইভাবে এটি এর sed
পূর্বের $B
বাফার সংগ্রহ করে । এবং সুতরাং এটি সংগ্রহ করা ইনপুট পিছনেsed
আউটপুট- $B
অ্যাকাউন্টিং লাইনগুলিতে মুদ্রণ করে । এর অর্থ এই যে, আমাদের পূর্ববর্তী উদাহরণ দেওয়া হবে দ্রণ আউটপুট, এবং তারপর elete এবং একটি প্যাটার্ন স্থান যা দেখে মনে হচ্ছে স্ক্রিপ্ট উপরের ফেরত পাঠাতে:sed
P
1
D
^2\n3$
... এবং স্ক্রিপ্টের শীর্ষে N
এক্সপুট ইনপুট লাইনটি পুনরুদ্ধার করা হয়েছে এবং তাই পরবর্তী পুনরাবৃত্তিটি দেখে মনে হচ্ছে:
^2\n3\n4$
এবং তাই আমরা যখন ইনপুটটির প্রথম উপস্থিতিটি পাই 5
, তখন প্যাটার্ন স্পেসটি আসলে দেখতে দেখতে:
^3\n4\n5$
তারপরে D
একাদশ লুপটি লাথি মারে এবং এটির মাধ্যমে এটি দেখতে মনে হয়:
^5$
এবং যখন N
এক্সট্রা ইনপুট লাইনটি টানা হয় তখন ইওএফ sed
হিট হয় এবং প্রস্থান করে। ততক্ষণে এটি কেবলমাত্র P
1 এবং 2 এর লাইনটি ছড়িয়ে দিয়েছে ।
এখানে একটি উদাহরণ রান করুন:
A=8 B=7 match='[24689]0'
seq 100 |
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
যে মুদ্রণ:
1
2
3
4
5
6
7
8
9
10
11
12
29
30
31
32
49
50
51
52
69
70
71
72
99
100