grep --before-context 5
ম্যাচের আগে 5 টি লাইন দেখায়।
আমি ম্যাচের আগে সবকিছু দেখাতে চাই।
করা grep --before-context 99999999
কাজ করবে কিন্তু এটি খুব বেশি পেশাদার নয়।
ম্যাচ পর্যন্ত সমস্ত ফাইল কীভাবে দেখাবেন?
grep --before-context 5
ম্যাচের আগে 5 টি লাইন দেখায়।
আমি ম্যাচের আগে সবকিছু দেখাতে চাই।
করা grep --before-context 99999999
কাজ করবে কিন্তু এটি খুব বেশি পেশাদার নয়।
ম্যাচ পর্যন্ত সমস্ত ফাইল কীভাবে দেখাবেন?
উত্তর:
সেড তার জন্য আরও ভাল।
শুধু কর:
sed '/PATTERN/q' FILE
এটি এর মতো কাজ করে:
প্রতিটি লাইনের জন্য, আমরা এটির সাথে মেলে কিনা তা দেখুন /PATTERN
:
এটি সবচেয়ে কার্যকর সমাধান, কারণ এটি দেখার সাথে সাথে PATTERN
এটি প্রস্থান করে qu ছাড়া q
, সেড বাকী ফাইলটি পড়তে থাকবে এবং এটি দিয়ে কিছুই করবে না। বড় ফাইলগুলির জন্য এটি একটি পার্থক্য করতে পারে।
এই কৌশলটি অনুকরণ করতেও ব্যবহার করা যেতে পারে head
:
sed 10q FILE
sed '/PATTERN/Q' FILE
লাইনটি এড়িয়ে যাবে। Q
এটি একটি জিএনইউ এক্সটেনশন, সুতরাং এটি কোনও সিডের সাথে কাজ করবে না।
sed
গ্রেপের বেশিরভাগ কার্যকারিতা প্রতিস্থাপন করতে পারে।
sed -n '1,/<pattern>/ p' <file>
এর অর্থ প্যাটার্নটি মিল না হওয়া পর্যন্ত প্রথম লাইন থেকে মুদ্রণ করা।
পরিসরের উদাহরণ দুটি
sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
ম্যাচটি সহ এবং মুদ্রণ করুন:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
ম্যাচটি সহ তবে না ছাপুন:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Q
এটি দুর্দান্ত তবে gnu নির্দিষ্ট আফাইক, sed -n '/pattern/!p;//q'
আরও পোর্টেবল হবে।
!
তোলে p
লাইন প্রযোজ্য না মিলে pattern
, কিন্তু তারপর //q
বিভ্রান্ত আমাকে ...
//
অর্থ "পূর্ববর্তী নিয়মিত প্রকাশ" (আমি ভেবেছিলাম এটি "খালি স্ট্রিংয়ের সাথে মিলে যায়")। আমি মনে করি একই সমাধানের একটি খাটো সংস্করণ: sed -n '/pattern/q;p
?
নিম্নলিখিত বিশুদ্ধ GNU grep
পদ্ধতিগুলি কার্যকর নয়।
তিন বার ব্যবহার করে ফাইল বারে " foo " স্ট্রিংয়ের প্রথম উদাহরণ পর্যন্ত সমস্ত কিছুর সন্ধান করুন :grep
grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar
" Foo " এর শেষ উদাহরণটির সাথে মিলছে :
grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar
দ্রষ্টব্য: সর্বশেষে বিশদগুলি grep
পাওয়া যাবে: মাল্টি-লাইন অনুসন্ধানের জন্য রেজেেক্স (গ্রেপ) ।
grep
কেবল যখনই একটি একক দাওয়াত চালানোর বিষয় হয় তখন কেন কেউ 7 টি (+ পিসি) ব্যবহার করতে চান sed
: sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??
sed
নিজস্ব উত্তরের মূল্য রয়েছে বলে মনে হচ্ছে বা অন্য কোনওটির সাথে যোগ করা যেতে পারে। পুনরায় 7 grep
টি: কারণ কোনও grep
উত্তর ছিল না ... (প্লাস, উত্তরটি কেন না তা দেখায়
উপরে মাইকেলের উত্তর যুক্ত করা হচ্ছে ...
সব লাইন মুদ্রণ করতে আপ, কিন্তু না সহ , প্রথম লাইনে FILE
ধারণকারী PATTERN
, চেষ্টা করে দেখুন:
sed '/.*PATTERN.*/{s///;q;}' FILE
এটি প্যাটার্নযুক্ত পুরো লাইনের সাথে মেলে, এটিকে একটি ফাঁকা রেখার সাথে প্রতিস্থাপন করে, তারপরে বাকী ফাইলটি প্রক্রিয়াজাত না করেই প্রস্থান করে।
পোস্ট-স্ক্রিপ্ট:
শেষে অতিরিক্ত নিউলাইন মুদ্রণ রোধ করার সবচেয়ে সহজ / পরিষ্কার উপায়টি (অন্য কোনও সরঞ্জামের সাথে জড়িত না করে) পুনরায় চালনা এবং নতুন চূড়ান্ত লাইনটি মুছে ফেলা ছিল:
sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'
... এবং যেহেতু আমরা এখন যেভাবেই লাইনটি মোছা করছি, আমাদের পূর্ববর্তী কাজগুলি নিরর্থক এবং আমরা এতে সহজতর করতে পারি:
sed '/PATTERN/q' FILE | sed '$d'
sed
অনুরোধের মাধ্যমে কীভাবে করা যায় তা দেখান ।
tcsh
এবং একটি bash
উপন্যাস উভয় ক্ষেত্রেই ব্যবহার করছিলাম, তাই আমার নিশ্চিত হওয়া দরকার একটি অপেক্ষাকৃত সংক্ষিপ্ত এক-লাইন সমাধান ছিল যা স্ট্যান্ডার্ড এবং জিএনইউ sed
(পোর্টেবিলিটির জন্য) উভয় ক্ষেত্রেই কাজ করে ; আপনার অবদান খুব ভাল পূরণ করতে পারে যে সমস্ত প্রয়োজনীয়তা। যে কেউ sed
খুব কম ব্যবহার করে , আমার সবচেয়ে গুরুত্বপূর্ণ প্রয়োজনটি এমন কিছুটির জন্য ছিল যা আমি এখন থেকে কয়েক বছর আগে সম্পাদনা করতে বা পুনরায় উদ্দেশ্য করতে চাইলে দ্রুত বুঝতে পারি।
প্রতিদিন কাজের জন্য কেবলমাত্র মৌলিক সরঞ্জামগুলি মনে রাখতে এবং কম মার্জিত এবং কম দক্ষ সমাধান গ্রহণ করতে ইচ্ছুক ব্যক্তিদের জন্য:
head -n $(grep -n pattern filename | cut -d: -f1) filename
যদি এই আদেশটি কোনও স্ক্রিপ্টের জন্য হয় তবে আমি আরও মার্জিত (এবং সম্ভবত দক্ষ) সমাধানগুলি সন্ধান করব। এটি যদি ওয়ান টাইম কমান্ড বা একটি থ্রো অ্যাওর স্ক্রিপ্ট হয় তবে আমার পাত্তা নেই।
আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন
tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac
অথবা
tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac
অথবা
tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac
প্রথম বিকল্পটি ওপি যা বলেছিল তার ঠিক অনুরূপ, এটি ফাইলের লাইনগুলি গণনা করে প্রসঙ্গের আগে টিআই যথেষ্ট লাইন প্রদর্শন নিশ্চিত করে
দ্বিতীয় বিকল্পটি প্রথম ম্যাচের লাইন নম্বর অনুসন্ধান করে (আপনি অভ্যন্তরীণ 'মাথা' পরিবর্তন করে এটিও পরিবর্তন করতে পারেন) এবং সেই সংখ্যার শীর্ষের চেয়ে
শেষ বিকল্পটি ম্যাচের সাথে সমস্ত নতুন রেখাকে প্রতিস্থাপন করে এবং দুটি সংলগ্ন ম্যাচের পরিবর্তে একটি নতুন লাইনের পরিবর্তে। এর আউটপুট হ'ল দুটি ম্যাচের মধ্যবর্তী পাঠ্যের প্রতিটি ব্লকের জন্য একটি লাইন। এর পরে এটি প্রথম লাইনটি (প্রথম ম্যাচ অবধি পাঠ্যের ব্লককে ছাঁটাই করা) ম্যাচটি বেছে নেওয়ার জন্য এবং প্রতিটি ম্যাচকে একটি নতুন লাইনে পুনরায় স্থানান্তরিত করার জন্য 'হেড' ব্যবহার করে। এই বিকল্পটি কেবলমাত্র ফাইলটি নিম্নলিখিত ফর্ম্যাটে থাকলে কাজ করে
pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern
texttexttext
texttexttexttexttexttexttexttexttext
এবং তাই এগিয়ে
sed
নীচে যে কমান্ডটি উদাররূপে।