একটি পরিবর্তনশীল উপর গ্রেপ


58

ধরা যাক আমার একটি পরিবর্তনশীল আছে

line="This is where we select from a table."

এখন আমি গ্রেপ করতে চাই বাক্যে কতবার সিলেক্ট হয়।

grep -ci "select" $line

আমি চেষ্টা করেছিলাম, কিন্তু কাজ হয়নি। আমি চেষ্টাও করেছি

grep -ci "select" "$line"

এটি এখনও কাজ করে না। আমি নিম্নলিখিত ত্রুটি পেয়েছি।

grep: This is where we select from a table.: No such file or directory

1
আপনি এখানে স্ট্রিং ব্যবহার করতে হবে ...<<<"$line" । কমান্ডটি grepতার পরিবর্তে কোনও ফাইলের প্রত্যাশা করছে
ভ্যালেন্টাইন বাজরামি

উত্তর:


84

হয়েছে grepতার মান ইনপুটের পড়ুন। আপনি সেখানে যান, একটি পাইপ ব্যবহার করে ...

$ echo "$line" | grep select

... বা এখানে একটি স্ট্রিং ...

$ grep select <<< "$line"

এছাড়াও, আপনি গ্রেপিংয়ের আগে নতুন লাইনের মাধ্যমে স্পেসগুলি প্রতিস্থাপন করতে চাইতে পারেন:

$ echo "$line" | tr ' ' '\n' | grep select

... বা আপনি grepকেবল ম্যাচটি মুদ্রণের জন্য বলতে পারেন :

$ echo "$line" | grep -o select

এটি কোনও মিল থাকলেই আপনাকে বাকী রেখা থেকে মুক্তি দিতে দেয়।

সম্পাদনা: ওফস, মার্কো অনেক ধন্যবাদ দ্রুত পড়ুন । উপস্থিতিগুলি গণনা করার জন্য, কেবল এগুলির কোনও পাইপ করুন wc(1);)

লজ্জাকারের মন্তব্যের পরে আর একটি সম্পাদনা করা হয়েছে , $lineব্যবহারের সময় উদ্ধৃতি দেওয়া হয়েছে echo


3
যেহেতু ওপি একটি স্ট্রিংয়ের সংখ্যার গণনা করতে চায় আপনি wcকাজটি শেষ করতে একটি যোগ করতে পারেন :grep -o <string> <<< "$variable" | wc -l
মার্কো

2
echo "$line"এটি তৈরির পরিবর্তে বিদ্যমান tr
নিউলাইনগুলি

হিয়ার স্ট্রিংয়ের সহজলভ্যতা কী? এটির জন্য বাশ বা অন্য কোনও শেল দরকার?

উইকিপিডিয়া অনুসারে , এখানে স্ট্রিংগুলি ব্যাশ, কেএসএস এবং জেডএসে পাওয়া যায় (তবে আমি ধরে নিচ্ছি যে সেখানে অন্যরাও থাকতে পারেন)।
জন ডব্লিউ এইচ স্মিথ

7
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

আপনার grepএত সহজ জিনিসটির জন্য কল করার দরকার নেই ।

বা একটি ফাংশন হিসাবে:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

এটি 2 বা 3 টি অর্গ নেয়। এর চেয়ে বেশি সরবরাহ করা তার ফলাফলগুলিকে আঁকিয়ে ফেলবে। আপনি এটি ব্যবহার করতে পারেন:

_occur=0; occur ... . 2 && echo "count: $_occur"

... যার সংঘটন গণনা ছাপে .মধ্যে ...যদি এটি ঘটে কমপক্ষে 2 বার। এটার মত:

count: 3

যদি $_occurপারেন খালি থাকে বা unsetযখন এটা প্রার্থনা করা হয়েছে তারপর এটা কোন শেল ভেরিয়েবল এ সব প্রভাবিত হবে return1 যদি "$2"ঘটে "$1"কম "$3"বার। অথবা, যদি কেবল দুটি টি আর্গ দিয়ে ডাকা হয় তবে এটি return1 "$2"না থাকলে কেবল 1 হবে "$1"। অন্যথায় এটি 0 ফেরত দেয়।

এবং তাই, এর সহজতম ফর্মটিতে, আপনি এটি করতে পারেন:

occur '' . && echo yay || echo shite

... যা ছাপায় ...

shite

... কিন্তু ...

occur . . && echo yay || echo shite

... মুদ্রণ করবে ...

yay

আপনি এটিকে কিছুটা আলাদাভাবে লিখতেও $2পারেন (*"$2"*)এবং "${1#*"$2"}"স্টেটমেন্ট এবং স্টেটমেন্ট উভয় ক্ষেত্রেই উদ্ধৃতিগুলি বাদ দিতে পারেন । যদি আপনি এটি করেন তবে আপনি sh[io]teম্যাচ টেস্টের মতো ম্যাচের জন্য শেল গ্লোবগুলি ব্যবহার করতে পারেন ।


1
+1: সত্যই, আরও দ্রুত। কাজ করে bashএবং dash/ sh(এবং সম্ভবত কয়েক অন্যদের)।
জন ডব্লিউ এইচ স্মিথ

@ জন ডাব্লুএইচএসমিথ - সম্পাদনাটি আরও ভাল, তবে এখনও ঠিক পোর্টেবল।
মাইক্রজারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.