দু'টি শব্দের মধ্যে একটির সাথে দুটিও নয়, তবে একটি লাইনের সন্ধান করতে কিভাবে গ্রেপ ব্যবহার করবেন?


11

আমি একটি টেক্সট ফাইলে 'ওয়ার্ড 1' এক্সওর 'ওয়ার্ড 2' দিয়ে লাইনগুলি অনুসন্ধান করতে চাই। সুতরাং এটি word1, word2 এর সাথে আউটপুট লাইন হওয়া উচিত তবে এই দুটি শব্দের রেখা নয়। আমি এক্সওআরটি ব্যবহার করতে চেয়েছিলাম তবে লিনাক্স কমান্ড লাইনে কীভাবে এটি লিখতে হয় তা আমি জানি না।

আমি চেষ্টা করেছিলাম:

grep 'word1\|word2' text.txt
grep word1 word2 text.txt
grep word1 text.txt | grep word2
grep 'word1\^word2' text.txt

এবং আরও অনেক কিছু, কিন্তু সাফল্য পেতে পারেনি।

উত্তর:


6

grep 'word1\|word2' text.txtলাইন ধারণকারী এর জন্য অনুসন্ধান word1বা word2। এর মধ্যে লাইন রয়েছে যা উভয়ই থাকে।

grep word1 text.txt | grep word2ধারণকারী লাইন এর জন্য অনুসন্ধান word1এবং word2। দুটি শব্দ ওভারল্যাপ করতে পারে (যেমন foobarরয়েছে fooএবং এতে ob) and উভয় শব্দ যুক্ত লাইনগুলি অনুসন্ধান করার অন্য একটি উপায়, তবে কেবল একটি ওভারল্যাপিং পদ্ধতিতে নয়, এটি উভয় ক্রমে অনুসন্ধান করা:grep 'word1.*word2\|word2.*word1' text.txt

grep word1 text.txt | grep -v word2ধারণকারী লাইন এর জন্য অনুসন্ধান word1কিন্তু না word2-vবিকল্প বিপরীত পরিবর্তে অ-মিল লাইন এবং অপসারণ ম্যাচিং লাইন রাখার, grep বলে। এটি আপনাকে চেয়েছিল অর্ধেক ফলাফল দেয়। প্রতিসম অনুসন্ধান যুক্ত করে, আপনি ঠিক একটি শব্দ যুক্ত সমস্ত লাইন পেয়ে যাবেন।

grep word1 text.txt | grep -v word2
grep word2 text.txt | grep -v word1

বিকল্পভাবে, আপনি দুটি শব্দ যুক্ত লাইন থেকে শুরু করতে পারেন এবং উভয় শব্দের সমন্বিত লাইনগুলি সরাতে পারেন। উপরের বিল্ডিং ব্লকগুলি দেওয়া, যদি শব্দগুলি ওভারল্যাপ না করে তবে এটি সহজ।

grep 'word1\|word2' text.txt | grep -v 'word1.*word2\|word2.*word1'

ধন্যবাদ আমি ঠিক এটি খুঁজছিলাম ছিল। অন্যান্য উত্তরগুলি খুব আকর্ষণীয় তাই এগুলির মধ্যে অসুস্থ চেহারা। অবদানের জন্য সবাইকে ধন্যবাদ।
লুকালী

17

জিএনইউ সহ awk:

$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar

বা বহনযোগ্য:

awk '((/foo/) + (/bar/)) % 2'

একটি সঙ্গে grepসঙ্গে সমর্থন -P(PCRE):

grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'

সহ sed:

sed '
  /foo/{
    /bar/d
    b
  }
  /bar/!d'

আপনি যদি কেবলমাত্র পুরো শব্দ বিবেচনা করতে চান (যেটি fooনা barহয় foobarবা barbarউদাহরণের মধ্যে নেই) তবে কীভাবে এই শব্দগুলি সীমিত করা যায় তা আপনাকে সিদ্ধান্ত নিতে হবে। যদি এটি অক্ষর, অঙ্কগুলি এবং অন্যান্য বাস্তবায়নের -wবিকল্পের মতো আন্ডারস্কোর ব্যতীত অন্য কোনও চরিত্রের দ্বারা grepহয় তবে আপনি সেগুলিতে পরিবর্তন করতে চান:

gawk 'xor(/\<foo\>/,/\<bar\>/)'
awk '((/(^|[^[:alnum:]_)foo([^[:alnum:]_]|$)/) + \
      (/(^|[^[:alnum:]_)bar([^[:alnum:]_]|$)/)) % 2'
grep -P '^((?=.*\bfoo\b)(?!.*\bbar\b)|(?=.*\bbar\b)(?!.*\bfoo\b))'

এটি আপনার জন্য জিএনইউর মতো বাস্তবায়ন না করে যা জিএনইউয়ের মতো শব্দ সীমা সমর্থন করে / sedনা করে যদি আপনি কিছুটা জটিল হয়ে ওঠেন ।sedsed\<\>awk


6
স্টিফেন, শেল স্ক্রিপ্টিং সম্পর্কে দয়া করে একটি বই লিখুন!
pfnuesel

দুঃখিত আমি কয়েক সপ্তাহ আগে কমান্ড লাইন শুরু করেছি। আমি কীভাবে এটি কেবল শব্দ অনুসন্ধান করতে বাধ্য করব? আমি -Pw এবং -WP চেষ্টা করেছি কিন্তু এটি আমাকে ভুল আউটপুট দিয়েছে। আমি 'ওয়ার্ড 1 / * ওয়ার্ড 2 এবং ওয়ার্ড 1 / ওয়ার্ড 2 এর মধ্যেও' 'ব্যবহার করার চেষ্টা করেছি।
লুকাল

@ লুকালী, সম্পাদনা দেখুন।
স্টাফেন চেজেলাস

2

একটি বাশ সমাধান:

#!/bin/bash 
while (( $# )); do
    a=0 ; [[ $1 =~ foo ]] && a=1 
    b=0 ; [[ $1 =~ bar ]] && b=1
    (( a ^ b )) && echo "$1"
    shift
done

এটি পরীক্ষা করার জন্য:

$ ./script {foo,bar}\ {foo,bar} neither
foo foo
bar bar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.