फ़ाइल से पैटर्न के साथ grep का उपयोग करते हुए, बेजोड़ पैटर्न प्रिंट करें


15

patterns.txt:

"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"

strings.xml

<string name="Introduction">One day there was an apple that went to the market.</string>
<string name="BananaOpinion">Bananas are great!</string>
<string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>

अपेक्षित उत्पादन:

"ExitWarning"
"SomeMessage"
"Help" 

मैं उन शर्तों को कैसे प्रिंट करूं patterns.txtजो अंदर नहीं मिली हैं Strings.xml? मैं मिलान किया / बेजोड़ मुद्रित कर सकते हैं लाइनों में Strings.xml, लेकिन मैं बेजोड़ कैसे प्रिंट करूं पैटर्न ? मैं ggrep (GNU grep) संस्करण 2.21 का उपयोग कर रहा हूं, लेकिन मैं अन्य उपकरणों के लिए खुला हूं। माफी अगर यह एक और सवाल का एक डुप्लिकेट है जो मुझे नहीं मिला।

जवाबों:


25

आप grep -oकेवल मिलान वाले भाग को प्रिंट करने के लिए उपयोग कर सकते हैं और परिणाम को grep -vमूल patterns.txtफ़ाइल पर एक सेकंड के लिए पैटर्न के रूप में उपयोग कर सकते हैं :

grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt

हालांकि इस विशेष मामले में आप join+ का उपयोग भी कर सकते हैं sort:

join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)

यह बहुत सुंदर है .. स्मार्ट!
XXL

आप एक से अधिक इनपुट फ़ाइलें (जैसे है, तो Strings1.xmlऔर Strings2.xml), आप भी आवश्यकता होगी -hपहली ग्रेप पर झंडा।
जेहेनड्रेन

@ संजयेंद्रन - हाँ, लेकिन सभी grepउस विकल्प का समर्थन नहीं करते। यदि आपके पास कई इनपुट फ़ाइलें हैं, तो मैं नहीं देखता कि आप catउन सभी को बस क्यों नहीं कर सकते और परिणाम को पाइप कर सकते हैं grep
दान_क्रांति

5

सबसे अच्छा तरीका शायद वही है जो @don_crissti ने सुझाया है, इसलिए यहाँ एक ही विषय पर भिन्नता है:

$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"

यह मूल रूप से @ don_crissti के दृष्टिकोण का विलोम है। यह पर्ल कम्पेटिबल रेग्युलर एक्सप्रेशंस ( -P) और -oस्विच के साथ मैचिंग लाइन के केवल प्रिंट वाले भाग का उपयोग करता है। फिर, रेगेक्स name=इसे खोजता है और इसे छोड़ देता है ( \K), और फिर पहले "( .+?") तक एक या अधिक वर्णों की तलाश करता है । यह String.txtफ़ाइल में मौजूद पैटर्न की सूची में परिणामित होता है, जिसे बाद में प्रक्रिया प्रतिस्थापन ( ) grep -vका उपयोग करके रिवर्स grep ( ) में इनपुट के रूप में पास किया जाता है ।<(command)


2

मैं उपयोग करूंगा cut, शायद। यही है, अगर, जैसा कि यह प्रतीत होता है, आप जानते हैं कि आप जिस उद्धृत स्ट्रिंग की तलाश कर रहे हैं, उसकी अपेक्षा कहां करें।

यदि मैं करता हूँ:

{   cut  -sd\" -f2 |
    grep -vFf- pat
}   <<\IN
#   <string name="Introduction">One day there was an apple that went to the market.</string>
#   <string name="BananaOpinion">Bananas are great!</string>
#   <string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
IN

... अपने उदाहरण के अपने खुद के प्रति सहेजने के बाद patterns.txtमें patऔर उपरोक्त आदेश उत्पादन होता है चल रहा है:

"ExitWarning"
"SomeMessage"
"Help"

cutप्रिंट करने के लिए केवल दूसरे "डबल-उद्धरण -dएलिट किए गए -field को प्रत्येक सीमांकक-मिलान लाइन के इनपुट के लिए और -sअन्य सभी को जोड़ देता है।

cutवास्तव में प्रिंट क्या grepहै:

Introduction
BananaOpinion
MessageToUser

grepलाइनों के लिए अपने नामित फ़ाइल ऑपरेंड को खोजता है जो अपने स्टड पैटर्न ile में ixed तार से -vमेल नहीं खाता है ।-F--f

यदि आप "मैच करने वाले के रूप में दूसरे -delimited फ़ील्ड पर भरोसा कर सकते हैं , तो यह निश्चित रूप grep -Pसे केवल -Fixed स्ट्रिंग्स और उनमें से केवल छोटे भागों का मिलान करके erl मोड पर एक अनुकूलन होगा क्योंकि cutभारी उठाने का काम करता है - और यह तेजी से करता है ।


1
for p in $(cat patterns.txt); do if ! grep $p strings.xml &>/dev/null; then echo $p; fi; done

यह समझना आसान है, लेकिन कई grep प्रक्रियाओं को कम करने का समय है, पैटर्न में प्रत्येक पंक्ति के लिए एक।


0

एक और तरीका यह है कि pattern.txt और Strings.xml को एक सूची में रखें और अद्वितीय पंक्तियों को खोजें

cat patterns.txt Strings.xml | grep -oFf patterns.txt | sort | uniq -u

स्पष्टीकरण:

cat patterns.txt Strings.xmlसब कुछ एक सूची में रखता है। grep -oFf patterns.txtप्रत्येक लाइन पर कचरा हटाता है। sortआत्म व्याख्यात्मक। सभी लाइनों को क्रमबद्ध करें। uniq -uकेवल अद्वितीय लाइनें प्रिंट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.