আমি একটি লাইন ফিল্টার করার জন্য একটি উপায় খুঁজতে চেষ্টা করেছি যেখানে এতে "লেবু" এবং "চাল" শব্দ রয়েছে। আমি জানি "কীভাবে" লেবু "বা" চাল "পাওয়া যায় তবে সেগুলির দুটি নয়। তাদের অন্যের পাশে থাকা দরকার নেই, কেবল পাঠ্যের একই লাইনের।
আমি একটি লাইন ফিল্টার করার জন্য একটি উপায় খুঁজতে চেষ্টা করেছি যেখানে এতে "লেবু" এবং "চাল" শব্দ রয়েছে। আমি জানি "কীভাবে" লেবু "বা" চাল "পাওয়া যায় তবে সেগুলির দুটি নয়। তাদের অন্যের পাশে থাকা দরকার নেই, কেবল পাঠ্যের একই লাইনের।
উত্তর:
"একই লাইনে উভয়ই" এর অর্থ "ভাত 'এর পরে এলোমেলো অক্ষর এবং তারপরে' লেবু 'বা অন্য পথে"।
রেজেক্সে যা হয় rice.*lemon
বা lemon.*rice
। আপনি এটি ব্যবহার করে একত্রিত করতে পারেন |
:
grep -E 'rice.*lemon|lemon.*rice' some_file
আপনি যদি বর্ধিতদের ( -E
) এর পরিবর্তে সাধারণ রেজেক্স ব্যবহার করতে চান তবে আপনার আগে ব্যাকস্ল্যাশ দরকার |
:
grep 'rice.*lemon\|lemon.*rice' some_file
আরও শব্দের জন্য যা দ্রুত কিছুটা দীর্ঘ হয় এবং সাধারণত একাধিক কল ব্যবহার করা সহজ grep
, উদাহরণস্বরূপ:
grep rice some_file | grep lemon | grep chicken
grep rice
লাইনগুলি সমন্বিত সন্ধান করে rice
। এটি খাওয়ানো হয় grep lemon
যা কেবলমাত্র লেবুযুক্ত লাইনগুলি খুঁজে পাবে .. এবং আরও অনেক কিছু। যেখানে ওপি - পাশাপাশি আপনার পূর্বের উত্তরগুলি - কোনও [চাল | লেবু | মুরগী]
|
ভিতরে পালানো দরকার grep
? ধন্যবাদ!
egrep
প্রসারিত রেজেক্স ব্যবহার করে যেখানে |
OR যুক্তি হিসাবে বোঝা যায়। grep
বেসিক রেজেক্সের ডিফল্ট, যেখানে \|
হয়
grep
এর ম্যানপেজে যেমন বলা হয়েছে , হ্রাস করা egrep
হয় এবং এটি দ্বারা প্রতিস্থাপন করা উচিত grep -E
। আমি সেই অনুযায়ী উত্তর সম্পাদনা করার স্বাধীনতা নিয়েছি।
আপনি প্রথম গ্রেপ কমান্ডের আউটপুটটি অন্য একটি গ্রেপ কমান্ডে পাইপ করতে পারেন এবং এটি উভয় ধরণের সাথে মিলবে। সুতরাং, আপনি যেমন কিছু করতে পারেন:
grep <first_pattern> <file_name> | grep <second_pattern>
বা,
cat <file_name> | grep <first_pattern> | grep <second_pattern>
আসুন আমাদের ফাইলে কিছু সামগ্রী যুক্ত করুন:
$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt
ফাইলটিতে কী রয়েছে:
$ cat test_grep.txt
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.
এখন, আমরা যা চাই গ্রেপ করা যাক:
$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.
আমরা কেবল সেই লাইনগুলি পাই যেখানে উভয় নিদর্শন মেলে। আপনি এটি প্রসারিত করতে পারেন এবং আরও "ও" ম্যাচের জন্য আউটপুটটিকে অন্য গ্রেপ কমান্ডে পাইপ করতে পারেন।
সঙ্গে grep -P
(পার্ল-সঙ্গতির) বিকল্প এবং ইতিবাচক lookahead Regex(?=(regex))
:
grep -P '(?=.*?lemon)(?=.*?rice)' infile
অথবা আপনি নীচে ব্যবহার করতে পারেন, পরিবর্তে:
grep -P '(?=.*?rice)(?=.*?lemon)' infile
.*?
সাথে সাথে কোনও প্যাটার্ন ( বা ) অনুসরণ করার পরে এর অর্থ হল । সবকিছু ঐচ্ছিক তোলে আগেই (মানে শূন্য বা সবকিছুর এক সময় মিলেছে ).
*
rice
lemon
?
.*
(?=pattern)
: ইতিবাচক লুকোহেড: ইতিবাচক লুয়াহেড কন্সট্রাক্ট হ'ল বন্ধনীগুলির একজোড়া, খোলার প্রথম বন্ধনী এবং তারপরে একটি প্রশ্ন চিহ্ন এবং সমান চিহ্ন by
সুতরাং এটি উভয় lemon
এবং rice
এলোমেলোভাবে ক্রমযুক্ত সমস্ত লাইন ফিরে আসবে । এছাড়াও এটি |
এস এবং দ্বিগুণ grep
এস ব্যবহার করা এড়ানো হবে ।
বাহ্যিক লিঙ্কগুলি:
উন্নত গ্রেপ টপিকগুলি ইতিবাচক লুকোহেড - ডিজাইনারদের জন্য জিআরপি
যদি আমরা স্বীকার করি যে grep
ভিত্তির ভিত্তিতে নয় এমন উত্তর সরবরাহ করা গ্রহণযোগ্য, যেমন উপরের উত্তরের উপর ভিত্তি করে awk
, তবে আমি একটি সাধারণ perl
লাইন প্রস্তাব করব :
$ perl -ne 'print if /lemon/ and /rice/' my_text_file
সন্ধান কিছু / সমস্ত শব্দের সাথে কেস কে উপেক্ষা করতে পারে /lemon/i and /rice/i
। বেশিরভাগ ইউনিক্স / লিনাক্সে মেশিন পার্ল ইনস্টল করার পাশাপাশি যেকোনও উপায়ে ইনস্টল করা থাকে।
গ্রেপ পাইপিং সমাধানটি স্বয়ংক্রিয় করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে:
#!/bin/bash
# Use filename if provided as environment variable, or "foo" as default
filename=${filename-foo}
grepand () {
# disable word splitting and globbing
IFS=
set -f
if [[ -n $1 ]]
then
grep -i "$1" ${filename} | filename="" grepand "${@:2}"
else
# If there are no arguments, assume last command in pipe and print everything
cat
fi
}
grepand "$@"
eval
এটির পরিবর্তে পুনরাবৃত্ত ফাংশন ব্যবহার করে প্রয়োগ করা উচিত , যা সহজেই ভেঙে যায়