প্রথম দীর্ঘতম লাইনটি গ্রেপ করুন
grep -Em1 "^.{$(wc -L <file.txt)}\$" file.txt
অনুশীলন ছাড়াই কমান্ডটি অসাধারণভাবে পড়া শক্ত কারণ এটি শেল- এবং রিজেক্সএক্স সিনট্যাক্সের সাথে মিশে।
ব্যাখ্যার জন্য, আমি প্রথমে সরলীকৃত সিউডোকোড ব্যবহার করব। শুরু হওয়া লাইনগুলি ##
শেলটিতে চালিত হয় না।
এই সরলীকৃত কোডটি ফাইলের নাম এফ ব্যবহার করে, এবং পাঠযোগ্যতার জন্য উদ্ধৃতি এবং রেগেক্সপের কিছু অংশ ছাড়বে।
কিভাবে এটা কাজ করে
কমান্ডটির দুটি অংশ রয়েছে, একটি grep
- এবং একটি wc
আহবান:
## grep "^.{$( wc -L F )}$" F
wc
একটি প্রক্রিয়া সম্প্রসারণ ব্যবহার করা হয় $( ... )
, তাই এটি সামনে চালানো হয় grep
। এটি দীর্ঘতম লাইনের দৈর্ঘ্য গণনা করে। শেল এক্সপেনশন সিনট্যাক্সটি একটি বিভ্রান্তিকর উপায়ে নিয়মিত এক্সপ্রেশন প্যাটার্ন সিনট্যাক্সের সাথে মিশ্রিত হয়, তাই আমি প্রক্রিয়া সম্প্রসারণকে পচন করব:
## wc -L F
42
## grep "^.{42}$" F
এখানে, প্রক্রিয়া সম্প্রসারণটি যে মানটি ফিরে আসবে তার সাথে প্রতিস্থাপন করা হয়েছিল, grep
ব্যবহৃত কমান্ডলাইন তৈরি করে । আমরা এখন নিয়মিত প্রকাশটি আরও সহজেই পড়তে পারি: এটি শুরু ( ^
) থেকে শেষ পর্যন্ত ঠিক মেলে ($
লাইনের ) । তাদের মধ্যে প্রকাশটি নিউলাইন ছাড়া অন্য কোনও চরিত্রের সাথে মিলিত হয়, যা 42 বার পুনরাবৃত্তি হয়। একত্রিত, এটি হ'ল লাইন যা হুবহু 42 টি অক্ষর নিয়ে গঠিত।
এখন, রিয়েল শেল কমান্ডগুলিতে ফিরে আসুন: grep
অপশন -E
( --extended-regexp
) {}
পঠনযোগ্যতার জন্য এড়ানোর অনুমতি দেয় । বিকল্প -m 1
( --max-count=1
) প্রথম লাইন সন্ধানের পরে এটি বন্ধ করে দেয়। <
মধ্যে wc
কমান্ড প্রতিরোধ তার stdin ফাইল লিখছেন, wc
দৈর্ঘ্য সঙ্গে একসঙ্গে ফাইলের নাম মুদ্রণ থেকে।
কোন দীর্ঘতম রেখা?
ফাইল নামটি দু'বার সংঘটিত হওয়ার সাথে উদাহরণগুলি আরও পঠনযোগ্য করার জন্য, আমি f
ফাইলনামের জন্য একটি ভেরিয়েবল ব্যবহার করব ; $f
উদাহরণের প্রতিটি ফাইলের নাম দ্বারা প্রতিস্থাপিত হতে পারে।
f="file.txt"
প্রথম দীর্ঘতম রেখাটি দেখান - প্রথম লাইনটি দীর্ঘতম রেখার মতো দীর্ঘ:
grep -E -m1 "^.{$(wc -L <"$f")}\$" "$f"
সমস্ত দীর্ঘতম রেখা দেখান - সমস্ত লাইন দীর্ঘতম রেখার মতো দীর্ঘ:
grep -E "^.{$(wc -L <"$f")}\$" "$f"
সর্বশেষতম লাইনটি দেখান - সর্বশেষ লাইনটি দীর্ঘতম রেখার মতো দীর্ঘ:
tac "$f" | grep -E -m1 "^.{$(wc -L <"$f")}\$"
একক দীর্ঘতম লাইনটি দেখান - অন্যান্য সমস্ত লাইনের চেয়ে দীর্ঘতম লাইন বা ব্যর্থ:
[ $(grep -E "^.{$(wc -L <"$f")}\$" "$f" | wc -l) = 1 ] && grep -E "^.{$(wc -L <"$f")}\$" "$f"
(শেষ কমান্ড যেমন সম্পূর্ণ grep কমান্ড প্রয়োগ পুনরাবৃত্তি অন্যদের তুলনায় আরও বেশি অদক্ষ হয়। এটা সম্ভবত পচে করা উচিত যাতে আউটপুট wc
এবং দ্বারা লিখিত লাইন grep
ভেরিয়েবল সংরক্ষিত আছে।
নোট করুন যে সমস্ত দীর্ঘতম লাইন আসলে সব লাইন হতে পারে ভেরিয়েবলে সঞ্চয় করার জন্য কেবল প্রথম দুটি লাইনই রাখা দরকার))