প্যাটার্ন সন্ধানের পরে কেবল মুদ্রণ আউটপুট


13

এখানে একটি স্ক্রিপ্ট আছে (আসুন এটি কল করুন echoer) যা গুচ্ছ তথ্যের স্ক্রিন প্রিন্ট করে। আমি কোনও প্যাটার্নটি সন্ধানের পরে কেবল লাইনগুলি দেখতে সক্ষম হতে চাই।

আমি সমাধানের ব্যবহারের মতো দেখতে দেখতে কল্পনা করি

echoer | solution_command <pattern>

আদর্শভাবে patternএকটি নিয়মিত অভিব্যক্তি হবে, তবে কঠোর মানের স্ট্রিংগুলি আমার পক্ষে যথেষ্ট।


সুতরাং প্যাটার্ন একাধিক স্ট্রিং হতে পারে?
ইনিয়ান

একটি গ্লোব? আপনি একটি নিয়মিত অভিব্যক্তি মানে? গ্লোবগুলি কেবল ফাইলের নাম প্রসারিত করতে পারে।
টেরডন

@ ইনিয়ান আমি নিশ্চিত না যে আমি প্রশ্নটি বুঝতে পেরেছি। আপনি কি জিজ্ঞাসা করার অর্থ কি আমি এই বিযুক্তির সাথে কাজ করতে চাই?
ব্যবহারকারী 23146

উত্তর:


21

AWK প্যাটার্ন রেঞ্জগুলির সাহায্যে এটি করতে পারে, যা কোনও নিয়মিত অভিব্যক্তি ব্যবহারের অনুমতি দেয়:

echoer | awk '/pattern/,0'

echoerপ্রথম লাইন মিলের সাথে শুরু করে আউটপুট মুদ্রণ করা হবে pattern

এডাব্লুকে প্যাটার্ন-ভিত্তিক, এবং সাধারণত "যদি এই প্যাটার্নটি মেলে তবে এটি করুন" ধরণের পদ্ধতির সাথে ব্যবহৃত হয়। "এই প্যাটার্ন" একটি নিদর্শনগুলির একটি ব্যাপ্তি হতে পারে, হিসাবে সংজ্ঞায়িত হয় "যখন এই প্যাটার্নটি মেলে তখন এটি করা শুরু করুন, যতক্ষণ না এই অন্যান্য প্যাটার্নটি মেলে"; এটি উপরে হিসাবে কমা দ্বারা পৃথক দুটি নিদর্শন লিখে নির্দিষ্ট করা হয়। প্যাটার্নগুলি পাঠ্য মেল হতে পারে, যেমন হিসাবে /pattern/, বর্তমান রেখাটি নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা করা, প্যাটার্নের বিরুদ্ধে পরীক্ষা করা হয়; এগুলি সাধারণ অভিব্যক্তিও হতে পারে, প্রতিটি লাইনের জন্য মূল্যায়ন করা হয় এবং যদি ফলাফলটি শূন্য বা অ-শূন্য হয় তবে মেলাকে বিবেচনা করা যেতে পারে।

এডাব্লুকে-তে, ডিফল্ট ক্রিয়াটি হ'ল বর্তমান লাইনটি মুদ্রণ করা।

এই সমস্ত একসাথে রাখা, awk '/pattern/,0'লাইনগুলির সাথে মিলের patternসন্ধান করে এবং একবার এটি সন্ধান করলে 0শর্তটি মেলে না হওয়া পর্যন্ত সমস্ত লাইনে ডিফল্ট ক্রিয়া প্রয়োগ করে (শূন্য নয়) non awk '/pattern/,""'খুব কাজ করবে।

হাবা ম্যানুয়াল আরো অনেক কিছু বিস্তারিত মধ্যে যায়।


3
আমি পরিসীমাটির শেষ হিসাবে শূন্য সহ পরিসীমা শব্দার্থ সম্পর্কে সচেতন ছিলাম না। ধন্যবাদ!
কুসালানন্দ

@ স্টেফেনকিট এটি দুর্দান্ত! আমি যদি এটি মেলে না কি মুদ্রণ করতে চাই 0? এটা হবে /pattern/,/0/? উত্তরটি স্পষ্টভাবে ডিফল্ট ক্রিয়াটি লেখার মতো দেখতে কেমন হবে?
ব্যবহারকারী 23146

@ ব্যবহারকারী 23146 হ্যাঁ, /pattern/,/0/এটি "0" ধারণকারী একটি লাইন (রেকর্ড) না পাওয়া পর্যন্ত মুদ্রণ করবে। একটি স্পষ্ট ক্রিয়া দিয়ে উত্তরে স্নিপেট লিখে /pattern/,0 { print $0 }বা সমতুল্যভাবে দেয় /pattern/,0 { print }
স্টিফেন কিট

7

sed@ স্টিফেনকিটের awkএকটির বাধ্যতামূলক সমতুল্য :

sed '/pattern/,$!d'

patternসেখানে একটি হিসাবে ব্যাখ্যা করা হয় বেসিক রেগুলার এক্সপ্রেশন মত grep(যেমন বিরোধিতা এক্সটেন্ডেড রেগুলার এক্সপ্রেশন মধ্যে awk/ egrep/ grep -E)। কিছু sedবাস্তবায়নের একটি -E(BSD, ast, সাম্প্রতিক GNU / ব্যস্তবক্স, শীঘ্রই POSIX) বা -r(GNU, ssed, busybox, সাম্প্রতিক কিছু BSD) বিকল্প রয়েছে যার পরিবর্তে এটি নিয়মিত এক্সপ্রেশনগুলি এক্সটেন্ডেড করা হয় এবং কিছু এটির জন্য -P(ast) বা -R(ssed) থাকে একটি পার্ল মত নিয়মিত অভিব্যক্তি।

সহ perl:

perl -ne 'print if /pattern/ .. undef'

4

জিএনইউ এবং * বিএসডি গ্রেপ সহ:

grep -A1000000000 pattern file

আপনার ফাইলটিতে 1M এর বেশি লাইন না থাকলে এটিই।


0

আপনি যদি পেজার ব্যবহার করছেন যেমন lessকমান্ড থেকে আউটপুট দেখতে

less +pattern

0

awk প্রথম প্যাটার্ন ম্যাচের পরে লাইনগুলির জন্য (তবে অন্তর্ভুক্ত নয়)

যদি ট্রিগার প্যাটার্নযুক্ত লাইনটি "CUT এখানে" সমতুল্য হয়, আপনি মুদ্রিত আউটপুট থেকে বাদ দিতে পারেন:

echoer | awk 'flag ; /pattern/ { flag=1 }'

ইনপুটটির প্রতিটি লাইন অ্যাডক কোডে দুটি উপাদান দিয়ে চলে। প্রথম উপাদানটি হ'ল flag, যা ভেরিয়েবলটি flagযদি ননজারো হয় তবে লাইনটি প্রিন্ট করুন aw যেহেতু awk ভেরিয়েবলগুলি ডিফল্টরূপে 0 হয় তাই এটি প্রাথমিকভাবে কোনও কিছু মুদ্রণ করবে না।

দ্বিতীয় উপাদানটি, /pattern/ { flag=1 }প্যাটার্নটি সনাক্ত করার সাথে সাথে পতাকাটি 1 এ সেট করে এবং পতাকাটি বাকি রানের জন্য সেই মানটি রাখে।

প্যাটার্নটি প্রথম সনাক্ত করার সময়, ইনপুটটির সেই লাইনটি মুদ্রণের সুযোগটি পেরিয়ে গেছে। পরবর্তী কোনও লাইন (প্যাটার্নযুক্ত অতিরিক্ত লাইন সহ) মুদ্রণ করবে।


0

সজোরে আঘাত

কিছুটা আড়ষ্ট, তবে এটি কাজ করে।

#!/bin/bash
found=false
while IFS= read -r; do
    if $found || [[ $REPLY =~ pattern ]]; then
        found=true
        printf '%s\n' "$REPLY"
    fi
done

এই সংস্করণটি নির্ভর করে catতবে এটি বোঝা সহজ।

#!/bin/bash
while IFS= read -r; do
    if [[ $REPLY =~ pattern ]]; then
        printf '%s\n' "$REPLY"
        break
    fi
done
cat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.