প্রথম লাইনটি যদি কোনও নির্দিষ্ট প্যাটার্নের সাথে মেলে তবে ফাইল সামগ্রী কীভাবে মুদ্রণ করবেন?


11

আমি একটি স্ক্রিপ্ট লিখছি, আমি ফাইলের প্রথম লাইনটি একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করে দেখতে চাই এবং যদি এটি ফাইলটি মুদ্রণ করে না তবে। আমি কীভাবে এটি অর্জন করতে পারি?

আমি কীভাবে প্যাটার্ন পরীক্ষা করব? প্যাটার্নটি পরীক্ষা করার এবং আউটপুট ভিত্তিতে কিছু করার কোনও উপায় আছে কি ..

সম্পাদনা: দয়া করে এই প্রশ্নটি একবার দেখুন: /programming/

আমি এই জাতীয় কিছু চাই, কিন্তু তাদের কেউই আমার পক্ষে কাজ করেনি। আমি মূলত যাচাই করতে চাই যে প্রথম লাইনটি একটি রেজেক্স প্যাটার্নের সাথে মেলে কিনা এবং সেই ফাইলের লাইনগুলি প্রিন্টের উপর ভিত্তি করে।


1
আপনি কী আউটপুট আশা করছেন? আপনি যে প্যাটার্নটি সন্ধান করছেন তা কী? আপনি এ পর্যন্ত কি কি?
টাকোমি

@ টাকোমি সম্পাদিত দয়া করে একবার দেখুন
ম্যাথিউ

উত্তর:


17

আপনি এটি দিয়ে এটি করতে পারেন ed:

ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN

কৌতুক এখানে প্রতিস্থাপন করতে চেষ্টা হল PATTERNউপর 1stনিজেই সঙ্গে সঙ্গতিপূর্ণ। edএটি নির্দিষ্ট প্যাটার্নটি খুঁজে না পাওয়া গেলে ত্রুটি ঘটবে সুতরাং ,p(পুরো ফাইল মুদ্রণ করুন) কেবলমাত্র 1s/PATTERN/&/সফল হলে কার্যকর করা হবে ।

বা সাথে sed:

sed -n '1{
/PATTERN/!q
}
p' infile

qযদি প্রথম লাইনটি ( !) মেলে না তবে এই ইউটিগুলি PATTERNঅন্যথায় এটি pসমস্ত লাইন মুদ্রণ করবে ।
বা জিবিইউ সহ টবি স্পিড দ্বারা চিহ্নিত হিসাবে sed:

sed '1{/PATTERN/!Q}' infile

Qহিসাবে একই qতবে এটি প্যাটার্ন স্পেস মুদ্রণ করে না।


আপনি GNU সেডের Qপরিবর্তে q, বা dআগে q(পোর্টেবল) যাতে -nপতাকা এবং pকমান্ডের প্রয়োজন না হয় : sed '1{/PATTERN/!Q}' infileবা sed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infileযথাক্রমে।
টবি স্পিড

dকমান্ড চক্রটি পুনরায় আরম্ভ করে যা আমাকে সর্বদা ধরা দেয়! : - |
টবি স্পিড

জিএনইউ sedদিয়ে প্রথম sedকমান্ড অভিযোগ করেছে sed: -e expression #1, char 10: extra characters after command(কারণ p) তবে edশেষ এবং সর্বশেষ sedপরামর্শগুলি কার্যকরভাবে কাজ করে।
স্কিপি লে গ্র্যান্ড গৌরূ 25'17

নোট: এই উত্তরের সরবরাহিত সমাধানগুলির মধ্যে অন্যান্য উত্তরের চেয়ে যোগ্যতা থাকতে পারে যে সেগুলি পাইপে প্রয়োগ করা যেতে পারে।
স্কিপি লে গ্র্যান্ড গৌরু

1
@ স্কিপাইলগ্র্যান্ড গৌরোগ - আপনি সেমিকোলনগুলির সাথে আদেশগুলি পৃথক না করে এটিকে ওয়ান-লাইনারে পরিণত করার চেষ্টা করেছেন - এটি করার সঠিক উপায় এটিsed -n '1{/PATTERN/!q};p'
ডোন_ক্রিসটি

15

POSIX সরঞ্জাম বুকে সহ:

{ head -n 1 | grep pattern && cat; } <file

1
{ডাবল} <মিষ্টি।
মাইকজার্ভ

@ মেকজার্ভ: নতুন ব্যক্তিকে বিভ্রান্তি থেকে বাঁচাতে আমি এটি ব্যবহার করার ইচ্ছা করি, তবে স্টিফেন সম্পাদিত এটি পরিষ্কার।
cuonglm

8
 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt

txtবর্তমান ডিরেক্টরিটিতে অ গোপন ফাইলগুলির নাম মুদ্রণ করবে যার প্রথম লাইনটি সমর্থন করে এমন ইনপ্লিমেন্টেশনেরpattern সাথে বর্ধিত নিয়মিত অভিব্যক্তির সাথে মেলেawknextfile

যদি ফাইলের নাম মুদ্রণের পরিবর্তে আপনি পুরো ফাইল সামগ্রীটি মুদ্রণ করতে চান তবে আপনি এটি করতে পারেন:

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt

এটি কেবলমাত্র একটি কমান্ড চালিত awkকরার ক্ষেত্রে দক্ষ তবে বড় ফাইল সহ কোনও ফাইলের বিষয়বস্তু ফেলে দেওয়ার সর্বাধিক দক্ষ কমান্ড না হওয়ায় আপনি সম্ভবত এরকম কিছু করে আরও ভাল পারফরম্যান্স অর্জন করতে পারেন:

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat

এটি হ'ল কেবল সেই awkফাইলগুলির তালিকা মুদ্রণের জন্য ব্যবহার করুন যা মেলে (0-সীমিত) এবং catতাদের বিষয়বস্তু ফেলে দিতে নির্ভর করে ।


6

আপনি যদি একটি শেল স্ক্রিপ্ট লিখছেন, আপনি যেমন কিছু করতে পারে

for file in ./*; do head -n 1 "$file" | grep -q 'PATTERN' && cat "$file"; done

বা, পার্লে:

perl -Tlne '$f = /PATTERN/ if $. == 1; print if $f; $. = 0 if eof' ./*

@ স্টাফেন চেজেলাস: close ARGVনির্ধারণের চেয়ে সম্ভবত মূর্খতা $.
cuonglm

@ ইটারডন আপনার দেখতে কোড গল্ফের মতো দেখাচ্ছে, সমস্ত এক লাইনে, ভেরিয়েবলের নামের চারপাশে কোনও বন্ধনী নেই এবং পরিষ্কার কাঠামোকে উত্সাহিত করছে না। আমি পোস্ট করার সময় আপনার একটি ডলারের চিহ্ন ছিল না, কেবল বাশ পড়ানোর উপায় নয়। আমি ধরে নিই যে সেগুলিগুলি পার্ল ব্যাকগ্রাউন্ড থেকে এসেছে যা আপনার মনে হয়, তাই আপনাকে ক্ষমা করা হবে! ;)

@ গাইস্ট হাই এবং সাইটে আপনাকে স্বাগতম! আমি আপনার উত্তরটিকে একটি মন্তব্যে রূপান্তর করেছি কারণ উত্তরগুলি কেবলমাত্র যদি সত্যিকার প্রশ্নের উত্তর দেওয়া হয় তবে পোস্ট করা উচিত। এটি ক্লাসিক অর্থে কোনও ফোরাম নয় এবং আমরা এখানে খাঁটি প্রশ্নোত্তর চাই। আপনি কটাক্ষপাত করা করতে চাইবেন সহায়তা কেন্দ্র বা নিতে সফর ভাল সাইট বুঝতে। এটি বলেছিল যে, আমার ব্যাকগ্রাউন্ডটি বাস্তবে জীববিদ্যায় রয়েছে তাই হ্যাঁ, আমার কোড পরিষ্কার থেকে অনেক দূরে :) তবে, আমি দেখতে পাচ্ছি না বন্ধনীগুলি এখানে কীভাবে সহায়তা করবে, উদ্ধৃতিগুলি ইতিমধ্যে ভেরিয়েবলটিকে রক্ষা করে। এটি বন্ধনী থেকে রক্ষা করবে কি ভাঙ্গতে হবে?
টেরডন

@ গাইস্ট আহ, দুঃখিত, আপনি মন্তব্য করতে পারেন ভুলে গেছেন। চ্যাট করতে আসা এবং নির্দ্বিধায় নির্দ্বিধায় , আমি নিশ্চিত যে আমি কিছু শিখতে পারি।
টেরডন

5

ওল্ডস্কুল, আপনার বাক্যটি কেবলমাত্র মানক কমান্ডে অনুবাদ করুন:

for file in *; do
    if head -n 1 "${file}" | grep -q 'PATTERN'; then
        cat "${file}"
    fi
done

বাশ শেখার জন্য এটি একটি ভাল শুরু। আপনার যদি কেবলমাত্র দ্রুত সমাধানের প্রয়োজন হয় তবে সেড-, অ্যাজিক- বা পার্ল-উত্তরগুলি চেষ্টা করুন। উভয়ই দুর্দান্ত তবে আপনার নিজের শিখার জন্য (এবং সম্ভবত চান) নিজস্ব ভাষা।

এটি একটি খুব সহজ উদাহরণ, সুতরাং আপনি আরও জানতে চাইলে আপনি রুবি, পিএইচপি, জেএস (উদাহরণস্বরূপ নোডেজগুলিতে) বা অন্য কোনও ভাষায় যা ফাইল অ্যাক্সেসের অনুমতি দেয় তাও চেষ্টা করতে পারেন। এমনকি সি / সি ++ বা জাভা কোনও ছোট কাজটি পরিচালনা করা সহজ হওয়া উচিত।


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