ফাইল থেকে নিদর্শন সহ গ্রেপ ব্যবহার করে তুলনাহীন নিদর্শনগুলি মুদ্রণ করুন


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, কিন্তু আমি অপ্রতিম কিভাবে মুদ্রণ করব নিদর্শন ? আমি জিগ্রিপ (জিএনইউ গ্রেপ) সংস্করণ ২.২১ ব্যবহার করছি তবে অন্যান্য সরঞ্জামের জন্য উন্মুক্ত। দুঃখিত এটি যদি অন্য কোনও প্রশ্নের সদৃশ হয় যা আমি খুঁজে পাই না।

উত্তর:


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প্রথম গ্রেপের পতাকাও লাগবে ।
jayhendren

@ জেহেেন্দ্রেন - হ্যাঁ তবে সমস্ত grepবিকল্প এই বিকল্পটিকে সমর্থন করে না । আপনি একাধিক ইনপুট ফাইল থাকে, তাহলে আমি দেখতে পাচ্ছি না কেন আপনি না কেবল পারা catতাদের সবাইকে এবং পাইপ থেকে ফলাফলের grep
don_crissti

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) এ ইনপুট হিসাবে পাস করা হয় যা ফাইলটিতে উপস্থিত নিদর্শনগুলির তালিকার ফলস্বরূপ ।<(command)


2

আমি ব্যবহার করব cut সম্ভবত । এটি হ'ল, যদি এটি প্রদর্শিত হয়, আপনি জানেন যে কোথায় উদ্ধৃত স্ট্রিংটি আপনি খুঁজছেন expect

যদি আমি করি:

{   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.txtpatএবং উপরোক্ত কমান্ডের আউটপুট চলমান:

"ExitWarning"
"SomeMessage"
"Help"

cutপ্রতিটি দ্বিতীয় "ডাবল-উদ্ধৃতি ইনপুট প্রতিটি ডিলিমিটার-মিলে যাওয়া লাইনের জন্য কেবল দ্বিতীয় ডাবল-উদ্ধৃতি -dমুছে ফেলার -fজন্য প্রিন্টগুলি এবং-s অন্যান্যদের uppresses।

কি cutআসলে ছাপে এ grepহল:

Introduction
BananaOpinion
MessageToUser

grepরেখাগুলির জন্য এটির নামের ফাইল অপরেন্দ অনুসন্ধান করে যা এর মধ্যে -vথাকা -Fঅক্স্ড স্ট্রিংগুলির সাথে মেলে না- প্যাটার্ন -fআইলে ।

আপনি যদি "ম্যাচের মতো দ্বিতীয়- সীমাবদ্ধ ক্ষেত্রের উপর নির্ভর করতে পারেন , তবে এটি অবশ্যই grep -Pসঠিকভাবে -Fixed স্ট্রিংগুলির সাথে মিলিত করে এরাল মোডের উপর একটি অপ্টিমাইজেশন হয়ে উঠবে কারণ cutসেগুলি ভারী উত্তোলন করে - এবং এটি দ্রুত করে


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

এটি বোঝা সহজ তবে একাধিক গ্রেপ প্রক্রিয়া তৈরির ডাউনটাইম রয়েছে, প্যাটার্ন.টেক্সটে প্রতিটি লাইনের জন্য একটি।


0

আরেকটি উপায় হ'ল প্যাটার্ন.টেক্সট এবং স্ট্রিংস.এক্সএমএলকে একটি তালিকায় রাখা এবং অনন্য সারি সন্ধান করা

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

ব্যাখ্যা:

cat patterns.txt Strings.xmlসবকিছুকে একটি তালিকায় রাখে। grep -oFf patterns.txtপ্রতিটি লাইনের আবর্জনা অপসারণ করে। sortস্বশাসিত। সমস্ত লাইন বাছাই করুন। uniq -uশুধুমাত্র অনন্য লাইন প্রিন্ট করে।

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