গ্রেজ-এ 'অনুসরণ করা হয় না' এর জন্য রেজেক্স নজর রাখে


103

আমি কেবল চিঠিটি Ui\.অনুসরণ না করে Lineএমনকি এমনকি সমস্ত দৃষ্টান্তের জন্য গ্রেপ করার চেষ্টা করছিL

অন্য স্ট্রিং অনুসরণ না করে একটি নির্দিষ্ট স্ট্রিংয়ের সমস্ত দৃষ্টান্ত খুঁজে পাওয়ার জন্য একটি রেজেেক্স লেখার উপযুক্ত উপায় কী?

লুক হেডস ব্যবহার করা

grep "Ui\.(?!L)" *
bash: !L: event not found


grep "Ui\.(?!(Line))" *
nothing

5
রেগেক্সের কোন উপ-প্রজাতি - পিসিআরই, ইআরই, বিআরই, গ্রেপ, এডি, সেড, পারল, অজগর, জাভা, সি, ...?
জোনাথন লেফলার

4
একদিকে যেমন, "ইভেন্ট খুঁজে পাওয়া যায় নি" ইতিহাসের সম্প্রসারণ ব্যবহার করে আসে। আপনি যদি ইতিহাসের প্রসারণটি এটি কখনও ব্যবহার না করে বন্ধ করতে চান এবং কখনও কখনও আপনার ইন্টারেক্টিভ আদেশগুলিতে বিস্মৃত চিহ্নটি ব্যবহার করতে সক্ষম হতে চান। set +o histexpandবাশে বা set +H, ওয়াইএমএমভিতে।
ট্রিপল

12
আমার ইতিহাস বিস্তারের বিষয়টিও ছিল। আমি মনে করি আমি একক উদ্ধৃতিতে স্যুইচ করে কেবল এটি সমাধান করেছি, সুতরাং শেলটি আর্গুমেন্টটি munge করার চেষ্টা করবে না।
কোডার

@ কোডার যা আমার সমস্যাটিও সমাধান করেছে। ধন্যবাদ।
এনএইচডালি

উত্তর:


151

নেতিবাচক lookahead, যা কি আপনি পরে থাকেন, মানক বেশি শক্তিশালী হাতিয়ার প্রয়োজন grep। আপনার একটি পিসিআরই-সক্ষম গ্রিপ দরকার।

আপনার যদি জিএনইউ থাকে grepতবে বর্তমান সংস্করণটি বিকল্পগুলি সমর্থন করে -Pবা --perl-regexpআপনি তারপরে যা চান তা পুনরায় ব্যবহার করতে পারেন।

যদি আপনার কাছে জিএনইউ (পর্যাপ্ত পরিমাণে সাম্প্রতিক সংস্করণ) না থাকে grepতবে পাওয়ার কথা বিবেচনা করুন ack


37
আমি নিশ্চিত যে এই ক্ষেত্রে সমস্যাটি কেবলমাত্র এটি যে ব্যাশে আপনার একক উদ্ধৃতি ব্যবহার করা উচিত ডাবল কোট নয় যাতে এটি !একটি বিশেষ চরিত্র হিসাবে বিবেচনা করে না ।
এনএইচডালি

(আমার উত্তরটি হুবহু বর্ণনা করার জন্য নীচে দেখুন))
এনএইচডালি

4
যাচাই করা হয়েছে, সঠিক উত্তরটি এই উত্তরটি এবং @ এনএইচডালির মন্তব্যের সাথে মিলিত হওয়া উচিত। উদাহরণ হিসেবে বলা যায়, এই কম্যান্ডের আমার জন্য কাজ করে: , grep -P * .log *> "ডি: \ টেম্প \ result.out" '^ * ধারণ করে * $। ((But_not_this)?!।)'।
wangf

3
ঐ যেখানে জন্য -Pপুনরায় চেষ্টা বংশীধ্বনিতুল্য ফলাফলের সমর্থিত নয় grep --invert-match: প্রাক্তন git log --diff-filter=D --summary | grep -E 'delete.*? src' | grep -E --invert-match 'xml'। @ ভিনিসিয়াস অট্টোনির উত্তরটি নিশ্চিত করতে ভুলবেন না।
ড্যানিয়েল সোকলোভস্কি

@ ওয়াংএফ আমি সাইগউইনের অধীনে ব্যাশ ব্যবহার করছি এবং যখন আমি একক উদ্ধৃতিতে পরিবর্তন করি, তখনও আমি "ইভেন্টটি পাওয়া যায় নি" ত্রুটিটি পাচ্ছি।
এসএসিল্ক

39

আপনার সমস্যার একটি অংশের উত্তর এখানে রয়েছে এবং এসিসি একইভাবে আচরণ করবে: অ্যাক ও নেতিবাচক চেহারা ত্রুটিগুলি প্রদান করছে

আপনি গ্রেপের জন্য ডাবল-কোট ব্যবহার করছেন যা বাশকে " !ইতিহাস সম্প্রসারণ কমান্ড হিসাবে ব্যাখ্যা করতে" অনুমতি দেয় ।

আপনার একক-কোয়েটে আপনার প্যাটার্নটি মোড়ানো দরকার: grep 'Ui\.(?!L)' *

তবে মান হিসাবে নেতিবাচক চেহারা দিয়ে সমস্যাগুলি সমাধান করার জন্য @ জোনাথন লেফলারের উত্তর দেখুন grep!


আপনি জিএনইউর এক্সটেনশন কার্যকারিতাটিকে grepস্ট্যান্ডার্ডের কার্যকারিতা দিয়ে বিভ্রান্ত করছেন grep, যেখানে মানটি grepপসিক্স। আপনি যা বলেন তা সত্য - আমি সি-শেল বর্বরতা অক্ষম করে বাশ চালাচ্ছি (কারণ আমি যদি সি শেল চাইতাম তবে আমি একটি ব্যবহার করতাম তবে আমি একটি চাই না), যাতে !জিনিসটি আমাকে প্রভাবিত করে না - তবে নেতিবাচক চেহারা পেতে আপনার অ-মানক প্রয়োজন grep
জোনাথন লেফলার

1
@ জোনাথন লেফলার, স্পষ্টতার জন্য ধন্যবাদ; আমি মনে করি আপনি ঠিক বলেছেন যে এটির উভয় লক্ষণের জন্য আমাদের উত্তর দুটি দরকার। ধন্যবাদ।
এনএইচডিলে

10

আপনি সম্ভবত গ্রেপ ব্যবহার করে স্ট্যান্ডার্ড নেতিবাচক চেহারাগুলি সম্পাদন করতে পারবেন না তবে সাধারণত "বিপরীত" স্যুইচ '-v' ব্যবহার করে আপনার সমতুল্য আচরণ করতে সক্ষম হওয়া উচিত। এটি ব্যবহার করে আপনি যা মেলে তার পরিপূরকটির জন্য একটি রেজেেক্স তৈরি করতে পারেন এবং তারপরে এটি 2 গ্রেপের মাধ্যমে পাইপ করতে পারেন।

প্রশ্নে রেজেক্সের জন্য আপনি এমন কিছু করতে পারেন

grep 'Ui\.' * | grep -v 'Ui\.L'

এটি আরও বেশি জিনিস বাদ দেবে, উদাহরণস্বরূপ যদি লাইনটিতে Ui.Line এবং Ui ছাড়া লাইন থাকে ine লাইন
nafg

1
(হ্যাঁ, এজন্যই আমি এটিকে কঠোরভাবে প্রণয়ন করি না This এটি দৃশ্যের গুরুত্বপূর্ণ অংশগুলিকে সমাধান করে যা মানুষকে এই সমস্যায় নেভিগেট করে, আরও কিছু না))
কারেল টুসেক

4

আপনার যদি এমন একটি রেজেক্স বাস্তবায়ন ব্যবহার করতে হবে যা নেতিবাচক চেহারাগুলি সমর্থন করে না এবং অতিরিক্ত অক্ষর (গুলি) মেলাতে আপনার কোনও আপত্তি নেই, তবে আপনি অবহেলিত অক্ষর শ্রেণি[^L] , পরিবর্তন| এবং স্ট্রিং অ্যাঙ্কারের$ ব্যবহার করতে পারেন ।

আপনার ক্ষেত্রে grep 'Ui\.\([^L]\|$\)' *কাজ করে।

  • Ui\. আপনার আগ্রহী সেই স্ট্রিংয়ের সাথে মেলে

  • \([^L]\|$\)এর বাইরে অন্য কোনও চরিত্রের সাথে Lমেলে বা এটি লাইনের শেষের সাথে মেলে: [^L]বা $

আপনি যদি কেবল একটি চরিত্রের চেয়ে বেশি বাদ দিতে চান তবে আপনাকে এটিতে আরও বিকল্প এবং অবহেলা নিক্ষেপ করতে হবে। aঅনুসরণ না করার জন্য bc:

grep 'a\(\([^b]\|$\)\|\(b\([^c]\|$\)\)\)' *

যা হয় ( রেখার শেষের পরে aনয় bবা তার পরে: aতারপর [^b]বা $) বা (এর aপরে bহয় অনুসরণ করে হয় না cবা রেখার শেষে অনুসরণ করা হয়: aতারপরে b, তারপরে [^c]বা পরে) $

এই জাতীয় অভিব্যক্তি এমনকি স্বল্প স্ট্রিংয়ের সাথে বেশ অনর্থক এবং ত্রুটির প্রবণ হয়ে উঠেছে। আপনি আপনার জন্য এক্সপ্রেশন তৈরি করতে কিছু লিখতে পারেন, তবে কেবলমাত্র একটি রেইজেক্স বাস্তবায়ন ব্যবহার করা সহজ হবে যা নেতিবাচক চেহারাগুলি সমর্থন করে।

* যদি আপনার প্রয়োগটি নন-ক্যাপচারিং গ্রুপগুলিকে সমর্থন করে তবে আপনি অতিরিক্ত অক্ষর ক্যাপচার এড়াতে পারবেন।


1

যদি আপনার গ্রেপ -P বা --perl-regexp সমর্থন করে না, এবং আপনি পিসিআরই-সক্ষম গ্রিপ ইনস্টল করতে পারেন, যেমন "পিসিগ্রেপ", পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত গ্রহণের জন্য জিএনইউ গ্রেপের মতো কোনও কমান্ড-লাইন বিকল্পের প্রয়োজন হবে না than আপনি শুধু চালানো

pcregrep "Ui\.(?!Line)"

"লাইন" এর জন্য আপনার "ইউআই। (?! (লাইন)) উদাহরণ হিসাবে যেমন অন্য নেস্টেড গ্রুপের প্রয়োজন নেই - বাইরের গ্রুপটি যথেষ্ট, যেমন আমি উপরে দেখিয়েছি।

নেতিবাচক প্রতিবেদনগুলি দেখার জন্য আমি আপনাকে আরও একটি উদাহরণ দেই: যখন আপনার কাছে "আইপেট" দ্বারা ফিরে আসা লাইনের তালিকা থাকে, প্রতিটি লাইনের মধ্যবর্তী প্যাকেটের সংখ্যা দেখায় এবং আপনার শূন্য প্যাকেট যুক্ত লাইনের প্রয়োজন হয় না, আপনি কেবল সঞ্চালন করুন:

ipset list | pcregrep "packets(?! 0 )"

আপনি যদি পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন পছন্দ করেন এবং পার্ল থাকলেও পিসিগ্রেপ না থাকলে বা আপনার গ্রেপ --perl-regexp সমর্থন করে না, আপনি এক লাইনের পার্ল স্ক্রিপ্টগুলি গ্রিপের মতো একইভাবে কাজ করতে পারেন:

perl -e "while (<>) {if (/Ui\.(?!Lines)/){print;};}"

পার্ল স্ট্রিডনকে গ্রেপের মতো একইভাবে গ্রহণ করে, যেমন

ipset list | perl -e "while (<>) {if (/packets(?! 0 )/){print;};}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.