tr -c \\n 1 <testfile | #first transform every [^\n] char to a 1
grep -nF '' | #next get line numbers
paste -d: - testfile | #then paste it together with itself
sort -t: -nk2,2 #then sort on second field
... এবং বিজয়ী ... লাইন 2, এটা মনে হবে।
2:1111:4for
4:11111:five!
1:1111111:seven/7
3:11111111:8 eight?
তবে এর সাথে সমস্যাটি হ'ল প্রতিটি লাইনটি কাজ করার জন্য দৈর্ঘ্যের দ্বিগুণের বেশি হতে হবে - তাই LINE_MAX কার্যকরভাবে অর্ধেক হয়ে যায়। কারণটি এটি ব্যবহার করছে - কোন, বেস 1? - লাইন দৈর্ঘ্য উপস্থাপন। একটি সাদৃশ্যপূর্ণ - এবং সম্ভবত আরও পরিচ্ছন্ন - পদ্ধতির প্রবাহটি সেই তথ্যকে সংকুচিত করতে পারে। আমার কাছে যে রেখাগুলি দেখা দেয় সেগুলির মধ্যে প্রথম ধারণাটি আমার উচিত unexpand
:
tr -c \\n \ <testfile | #transform all [^\n] to <space>
unexpand -t10 | #squeeze every series of 10 to one tab
grep -nF '' | #and get the line numbers
sed 's/:/!d;=;:/;h;:big #sed compares sequential lines
$P;$!N; /\(:[^ ]*\)\( *\)\n.*\1.*\2/!D #newest line is shorter or...
g;/:./!q;b big' | #not; quit input entirely for blank line
sed -f - -e q testfile #print only first occurrence of shortest line
প্রিন্ট ...
2
4for
অন্য একটি, ঠিক sed
:
sed -n '/^\n/D;s/\(.\)\(\n.*\)*/\1/g
$p;h; s// /g;G;x;n;//!g;H;s// /g
G; s/^\( *\)\(\n \1 *\)\{0,1\}\n//
D' <infile >outfile
সিনট্যাক্সটি মানদণ্ডের সাথে সম্মতিযুক্ত - তবে এটি কোনও গ্যারান্টি নয় যে কোনও পুরানো সঠিকভাবে sed
পরিচালনা করবে \(reference-group\)\{counts\}
- অনেকে তা করেন না।
এটি মূলত বারবার ইনপুটটিতে একই রেজিএক্সপ্যাক্স প্রয়োগ করে - এটি সংকলনের সময় হলে খুব উপকারী হতে পারে। এই নিদর্শনটি হ'ল:
\(.\)\(\n.*\)*
যা বিভিন্নভাবে বিভিন্ন স্ট্রিংয়ের সাথে মেলে। উদাহরণ স্বরূপ:
string1\nstring2\nstring3
... সাথে মিলেছে s
মধ্যে \1
এবং ''
মধ্যে নাল স্ট্রিং \2
।
1\nstring2\nstring3
... সাথে মিলেছে 1
মধ্যে \1
এবং \nstring2\nstring3
মধ্যে\2
\nstring2\nstring3
... সাথে মিলেছে \n
মধ্যে \1
এবং ''
মধ্যে নাল স্ট্রিং \2
। \n
প্যাটার্ন স্পেসের শিরোনামে ই-লাইন হওয়ার কোনও সম্ভাবনা থাকলে এটি সমস্যাযুক্ত হবে - তবে /^\n/D
, এবং //!g
কমান্ডগুলি এটি প্রতিরোধ করতে ব্যবহৃত হয়। আমি [^\n]
এই ছোট স্ক্রিপ্টের জন্য অন্যান্য প্রয়োজনীয়তা ব্যবহার করেছি, যা বহনযোগ্যতাকে উদ্বেগজনক করে তুলেছে এবং এটি প্রায়শই ভুলভাবে ব্যাখ্যা করা যায় এমন অনেক উপায়ে আমি সন্তুষ্ট ছিল না। প্লাস, .
দ্রুত।
\nstring2
string1
... মেলে \n
এবং s
আবার \1
এবং উভয় পেতে ''
মধ্যে নাল স্ট্রিং \2
। খালি লাইনগুলি একেবারেই মেলে না।
যখন g
নিদর্শনটি নিখরচায় প্রয়োগ করা হয় তখন দুটি পক্ষপাত - উভয় বাম-সর্বাধিক স্ট্যান্ডার্ড পক্ষপাত এবং কম ডানদিকের \n
ইওলাইন পক্ষপাত - একটি এড়িয়ে যেতে প্রভাবিত করার জন্য প্রতি-ভারসাম্যপূর্ণ। কয়েকটি উদাহরণ:
s/\(.\)\(\n.*\)*/\1:\2/g
s/\(.\)\(\n.*\)*/\2\1:/g
s/\(.\)\(\n.*\)*/\1: /g
s/\(.\)\(\n.*\)*/ :\2/g
... যদি সমস্ত প্রয়োগ করা হয় (পর পর নয়) নিম্নলিখিত স্ট্রিংয়ে ...
string1\nstring2
... এটিকে রূপান্তরিত করবে ...
s:t:r:i:n:g:1:\nstring2
s:t:r:i:n:g:\nstring21:
s:t:r:i:n:g:1:
: : : : : : :\nstring2
মূলত আমি রেজিপেক্সটি যে কোনও প্যাটার্ন-স্পেসে প্রয়োগ করি সেখানে কেবল সর্বদা প্রথম লাইনটি পরিচালনা করতে ব্যবহার করি। এটি আমাকে ধরে রাখা সংক্ষিপ্ততম ম্যাচ-এতদূর লাইন এবং অতি সাম্প্রতিক রেখার পরীক্ষার লুপগুলিকে অবলম্বন না করে দুটি ভিন্ন সংস্করণ জাগল করতে সক্ষম করে - প্রতিটি প্রতিস্থাপন প্রয়োগ করে পুরো প্যাটার্ন-স্পেস একবারে পরিচালনা করে।
আক্ষরিক স্ট্রিং / স্ট্রিং তুলনার জন্য বিভিন্ন সংস্করণ প্রয়োজনীয় - সুতরাং প্রতিটি লাইনের একটি সংস্করণ থাকতে হবে যেখানে সমস্ত অক্ষর সমান হওয়ার গ্যারান্টিযুক্ত। তবে অবশ্যই যদি এক বা অন্যটিকে প্রকৃতপক্ষে ইনপুটটির মধ্যে সংক্ষিপ্ততম রেখা হিসাবে চিহ্নিত করা উচিত, তবে আউটপুটে মুদ্রিত রেখাটি সম্ভবত লাইনটির মূল সংস্করণ হওয়া উচিত - তুলনার স্বার্থে আমি স্যানিটাইজ / হোমোজেনাইজড করে না এমন একটি নয়। এবং তাই আমার প্রতিটিটির দুটি সংস্করণ দরকার।
দুর্ভাগ্যজনক যে অন্য একটি প্রয়োজনীয়তা হ্যান্ডেল করার জন্য প্রচুর পরিমাণে বাফার স্যুইচ করা হয় - তবে কমপক্ষে দু'টিই বর্তমান থাকার জন্য প্রয়োজনীয় চারটি লাইনের চেয়ে বেশি কখনও অতিক্রম করে না - এবং তাই এটি ভয়াবহ নয়।
যাইহোক, প্রতিটি চক্রের জন্য প্রথম যেটি ঘটে তা হ'ল স্মরণিত রেখায় একটি রূপান্তর - কারণ কেবলমাত্র অনুলিপিটি সংরক্ষণ করা আসলে আক্ষরিক আসল - এতে ...
^ \nremembered line$
... এবং এর পরে n
এক্সপুট ইনপুট লাইনটি কোনও পুরানো বাফারকে ওভাররাইট করে। এটিতে কমপক্ষে একটি একক অক্ষর না থাকলে এটি কার্যকরভাবে উপেক্ষা করা হয়। q
প্রথমটি ফাঁকা রেখায় কেবল ইউটি করা আরও সহজ হবে তবে আমার পরীক্ষার ডেটাগুলির অনেকগুলি ছিল এবং আমি একাধিক অনুচ্ছেদ পরিচালনা করতে চেয়েছিলাম wanted
এবং তাই যদি এটিতে কোনও অক্ষর থাকে তবে এর আক্ষরিক সংস্করণটি মনে রেখায় যুক্ত করা হয় এবং এর ব্যবধানযুক্ত তুলনা সংস্করণটি প্যাটার্ন স্পেসের শীর্ষে অবস্থিত:
^ \n \nremembered line\nnew$
শেষটি সেই প্যাটার্ন স্পেসে প্রতিস্থাপন প্রয়োগ করা হয়েছে:
s/^\( *\)\(\n \1 *\)\{0,1\}\n//
সুতরাং যদি নিউলাইনটি কমপক্ষে একটি অক্ষর রক্ষা করার জন্য মনে রাখা রেখাটি রাখতে প্রয়োজনীয় জায়গার মধ্যে ফিট করতে পারে তবে প্রথম দুটি লাইন অপসারণ করা হবে, অন্যথায় কেবল প্রথমটি।
ফলাফল নির্বিশেষে প্যাটার্ন স্পেসের প্রথম লাইনটি D
আবার শুরু করার আগে চক্রের শেষের দিকে সর্বদা একত্রে থাকে। এর অর্থ হ'ল নতুন লাইনটি যদি স্ট্রিংয়ের চেয়ে কম হয় ...
new
... চক্রের প্রথম প্রতিস্থাপনে ফেরত পাঠানো হয় যা সর্বদা প্রথম নতুন লাইনের চর থেকে সর্বদা ফিরবে - এবং তাই এটি পুরোপুরি থেকে যায়। তবে যদি তা না হয় তবে স্ট্রিং ...
remembered line\nnew
... পরিবর্তে পরবর্তী চক্র শুরু হবে, এবং প্রথম প্রতিস্থাপন এটি থেকে স্ট্রিংটি ছড়িয়ে যাবে ...
\nnew
...প্রত্যেকবার.
একেবারে শেষ লাইনে মনে রাখা রেখাটি স্ট্যান্ডার্ড আউট প্রিন্ট করা হয় এবং উদাহরণস্বরূপ দেওয়া তথ্যের জন্য এটি প্রিন্ট করে:
4for
তবে, গুরুত্ব সহকারে ব্যবহার করুন tr
।