উত্তর:
ছাড়া অন্য একটি সরঞ্জাম grepহ'ল উপায়।
পার্ল ব্যবহার করে, উদাহরণস্বরূপ, আদেশটি হ'ল:
perl -ne 'print if /pattern1/ xor /pattern2/'
perl -neস্টিডিনের প্রতিটি লাইনের উপরে প্রদত্ত কমান্ডটি চালায়, যা এই ক্ষেত্রে লাইনটি মেলে যদি এটি প্রিন্ট করে তবে /pattern1/ xor /pattern2/অন্য কথায় একটি প্যাটার্নের সাথে মেলে তবে অন্যটি (একচেটিয়া বা) নয়।
এটি উভয় ক্রমে প্যাটার্নটির জন্য কাজ করে এবং এর একাধিক আহ্বানের চেয়ে ভাল পারফরম্যান্স হওয়া উচিত grepএবং পাশাপাশি টাইপিংও কম।
বা, আরও কম সংক্ষেপে:
awk 'xor(/pattern1/,/pattern2/)'
বা বিশ্রী সংস্করণের জন্য যা নেই xor:
awk '/pattern1/+/pattern2/==1`
xorকেবল জিএনইউ অ্যাওক- এ কি আউক পাওয়া যায়?
/pattern1/+/pattern2/==1আইআর xorঅনুপস্থিত।
\bনিজেরাই নিদর্শনগুলিতে শব্দের গণ্ডি ( ) স্থাপন করতে পারেন \bword\b।
দিয়ে চেষ্টা করুন egrep
egrep 'pattern1|pattern2' file | grep -v -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
grep -e foo -e bar | grep -v -e 'foo.*bar' -e 'bar.*foo'
Direct invocation as either egrep or fgrep is deprecatedgrep -E
-fএবং -eঅপশন থাকা উচিত যদিও এটি পুরানো egrepএবং কিছু fgrepসময়ের জন্য সমর্থন অব্যাহত থাকবে।
grep(যে সমর্থন -F, -E, -e, -fPOSIX প্রয়োজন হিসাবে) হয় /usr/xpg4/bin। এতে থাকা ইউটিলিটিগুলি /binপুরানো anti
grepপার্ল-জাতীয় নিয়মিত এক্সপ্রেশন (যেমন pcregrepবা জিএনইউ বা অ্যাস্ট-ওপেন grep -P) সমর্থন করে এমন বাস্তবায়নগুলি সহ , আপনি এটি একটি grepনিমন্ত্রণে এটি করতে পারেন :
grep -P '^(?=.*pat1)(?!.*pat2)|^(?=.*pat2)(?!.*pat1)'
যে লাইন যে মিল খুঁজে হয় pat1কিন্তু pat2, অথবা pat2কিন্তু pat1।
(?=...)এবং (?!...)যথাক্রমে অপারেটরগুলি এগিয়ে এবং নেতিবাচক চেহারা হয়। তাই টেকনিক্যালি, বিষয় (শুরুতে জন্য উপরের সৌন্দর্য ^) প্রদান করা এটি দ্বারা অনুসৃত হচ্ছে .*pat1এবং অনুসরণ না .*pat2বা, সঙ্গে একই pat1এবং pat2বিপরীত।
উভয় নিদর্শন রয়েছে এমন রেখাগুলির জন্য এটি সাবজেক্টিমাল যা সেগুলি পরে দু'বার সন্ধান করা হবে। আপনি পরিবর্তে আরও উন্নত পার্ল অপারেটর ব্যবহার করতে পারেন:
grep -P '^(?=.*pat1|())(?(1)(?=.*pat2)|(?!.*pat2))'
(?(1)yespattern|nopattern)এর সাথে মেলে yespatternযদি 1স্ট্যান্ড ক্যাপচার গ্রুপটি ( ()উপরে খালি ) মিলছে এবং nopatternঅন্যথায়। যদি এটি ()মেলে তবে এর অর্থ pat1মেলে না, তাই আমরা সন্ধান করি pat2(সামনের দিকে ইতিবাচক চেহারা) এবং আমরা অন্যথায় নয় pat2 ( সামনে ইতিবাচক চেহারা) খুঁজছি।
সহ sed, আপনি এটি লিখতে পারেন:
sed -ne '/pat1/{/pat2/!p;d;}' -e '/pat2/p'
grep: the -P option only supports a single patternকমপক্ষে প্রতিটি সিস্টেমে আমার অ্যাক্সেস রয়েছে এতে ব্যর্থ। যদিও আপনার দ্বিতীয় সমাধানের জন্য +1।
grep। pcregrepএবং অ্যাস্ট-ওপেন গ্রেপ এর সমস্যা নেই। আমি -eবিকল্প আরআর অপারেটরের সাথে একাধিক প্রতিস্থাপন করেছি , সুতরাং এটি grepএখন GNU এর সাথেও কাজ করা উচিত ।
বুলিয়ান পদগুলিতে, আপনি একটি xor বি খুঁজছেন, যা হিসাবে লেখা যেতে পারে
(এ এবং বি নয়)
অথবা
(খ এবং এ নয়)
প্রদত্ত যে আপনার প্রশ্নটিতে উল্লেখ করা হয়নি যে আপনি যতক্ষণ না মিলে যাওয়া লাইনগুলি দেখানো হচ্ছে আউটপুট ক্রমের সাথে জড়িত রয়েছেন, A xor B এর বুলিয়ান বিস্তৃতিটি গ্রেপ-এ খুব সুন্দর রঙিন:
$ cat << EOF > foo
> a b
> a
> b
> c a
> c b
> b a
> b c
> EOF
$ grep -w 'a' foo | grep -vw 'b'; grep -w 'b' foo | grep -vw 'a';
a
c a
b
c b
b c
sort | uniq।
নিম্নলিখিত উদাহরণের জন্য:
# Patterns:
# apple
# pear
# Example line
line="a_apple_apple_pear_a"
এই বিশুদ্ধরূপে সঙ্গে কাজ করা যেতে পারে grep -E, uniqএবং wc।
# Grep for regex pattern, sort as unique, and count the number of lines
result=$(grep -oE 'apple|pear' <<< $line | sort -u | wc -l)
যদি grepপার্ল নিয়মিত প্রকাশের সাথে সংকলিত হয় তবে আপনি এখানে পাইপ লাগানোর পরিবর্তে শেষ ঘটনাটিতে মিল করতে পারেন uniq:
# Grep for regex pattern and count the number of lines
result=$(grep -oP '(apple(?!.*apple)|pear(?!.*pear))' <<< $line | wc -l)
ফলাফল আউটপুট:
# Only one of the words exists if the result is < 2
((result > 0)) &&
if (($result < 2)); then
echo Only one word matched
else
echo Both words matched
fi
একটি এক-লাইনার:
(($(grep -oP '(apple(?!.*apple)|pear(?!.*pear))' <<< $line | wc -l) == 1)) && echo Only one word matched
আপনি যদি প্যাটার্নটিকে হার্ড-কোড করতে না চান, তবে এটিকে উপাদানগুলির একটি পরিবর্তনশীল সেট সহ একত্রিত করে একটি ফাংশন দিয়ে স্বয়ংক্রিয় করা যেতে পারে।
এটি পাইপে বা অতিরিক্ত প্রক্রিয়াবিহীন কোনও ফাংশন হিসাবে বাশ-এ স্থানীয়ভাবে করা যেতে পারে তবে এতে আরও জড়িত থাকবেন এবং সম্ভবত আপনার প্রশ্নের ক্ষেত্রের বাইরে।
Big apple\nএবং pear-shaped\n, তবে আউটপুটে both দুটি লাইন থাকা উচিত। আপনার সমাধান 2 একটি গণনা পেতে হবে; দীর্ঘ সংস্করণটি "উভয় শব্দের সাথে মিলেছে" (যা ভুল প্রশ্নের উত্তর report) এবং সংক্ষিপ্ত সংস্করণটি কিছুই বলবে না report (3) একটি পরামর্শ: -oএখানে ব্যবহার করা একটি সত্যই খারাপ ধারণা, কারণ এটি ম্যাচগুলি যুক্ত লাইনগুলি লুকিয়ে রাখে, তাই যখন উভয় শব্দ একই লাইনে প্রদর্শিত হয় আপনি দেখতে পারবেন না। … (চালিয়ে যাওয়া)
uniq/ sort -uএবং অভিনব পার্ল নিয়মিত অভিব্যক্তি এই প্রশ্নের কোনও কার্যকর উত্তর যুক্ত করতে পারে না। তবে, তারা তা করলেও এটি একটি খারাপ উত্তর হতে পারে কারণ আপনি প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে তারা কীভাবে অবদান রাখছেন তা ব্যাখ্যা করেন না । ( একটি ভাল ব্যাখ্যার উদাহরণের জন্য স্টাফেন চ্যাজেলাসের উত্তর দেখুন ))
[a-z][a-z0-9]\(,7\}\(\.[a-z0-9]\{,3\}\)+? (২) কোনও শব্দ / নিদর্শনগুলির মধ্যে একটি যদি এক লাইনে একাধিকবার উপস্থিত হয় (এবং অন্যটি প্রকাশিত হয় না) তবে কী হবে? শব্দের সাথে কি এটি একবার উপস্থিত হয়, বা এটি একাধিক ঘটনা হিসাবে গণ্য হয়?