grep -P আর কাজ করে না। আমি কীভাবে আমার অনুসন্ধানগুলি আবার লিখতে পারি?


99

দেখে মনে হচ্ছে ওএসএক্সের নতুন সংস্করণটি আর সমর্থন করে না grep -Pএবং এর ফলে আমার স্ক্রিপ্টগুলির কিছু কাজ বন্ধ করে দিয়েছে।

var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`

আমাকে গ্রেপটি একটি ভেরিয়েবলে ক্যাপচার করতে হবে এবং আমার শূন্য প্রস্থের অবস্থানগুলিও ব্যবহার করতে হবে \K

var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`

কোনও বিকল্প ব্যাপকভাবে প্রশংসা করা হবে।


8
gnu গ্রেপ ইনস্টল সম্পর্কে কীভাবে?
কেন্ট

আপনি কি নিশ্চিত যে এটিই -P? আমার এটা আছে।
কেভিন

4
@ কেভিন এটি 10.8-এ সরানো হয়েছে।
Lri

8
@ অ্যাড্রিয়ানফ্রুইথर्थ ওএস এক্স এর grepপ্রকৃতপক্ষে grep (GNU grep) 2.5.110.7 থেকে grep (BSD grep) 2.5.1-FreeBSD10.8 এ পরিবর্তিত হয়েছে । আমার ধারণা এটি জিপিএলের কারণে হয়েছিল। FreeBSD 'র grepএছাড়াও গনুহ উপর ভিত্তি করে তৈরি grepএবং উভয় সংস্করণই grep2002. থেকে এসেছ --labelএবং -u/ --unix-byte-offetsএছাড়াও 10.8 মধ্যে সরানো হয়েছে। -z/ --decompress, -J/ --bz2decompress, --exclude-dir, --include-dir, -S, -O, এবং -p10.8 মধ্যে যোগ করা হয়েছে। -Zথেকে পরিবর্তিত --nullকরা --decompress
ল্রি

4
grepওএস এক্সের সাথে আসা ফ্রিবিএসডি 2002 সালের, এবং উইকি.ফ্রিবিএস.আর.বি.এসডিগ্রিপ এখনও বলেছে যে "একমাত্র টোডো আইটেমটি কার্যকারিতা উন্নত করছে", তাই হ্যাঁ। time grep aa /usr/share/dict/words>/dev/nullওএস এক্স এর গ্রেপ সহ প্রায় 0.09 সেকেন্ড এবং আমার আইম্যাকের পুনরাবৃত্তি রানগুলিতে একটি নতুন জিএনইউ গ্রেপ সহ প্রায় 0.01 সেকেন্ড সময় নেয়।
ল্রি

উত্তর:


68

আপনি যদি সর্বনিম্ন কাজ করতে চান তবে পরিবর্তন করুন

grep -P 'PATTERN' file.txt

প্রতি

perl -nle'print if m{PATTERN}' file.txt

এবং পরিবর্তন

grep -o -P 'PATTERN' file.txt

প্রতি

perl -nle'print $& while m{PATTERN}g' file.txt

সুতরাং আপনি পাবেন:

var1=`perl -nle'print $& while m{(?<=<st:italic>).*(?=</italic>)}g' file.txt`
var2=`perl -nle'print $& while m{(property:)\K.*\d+(?=end)}g' file.txt`

আপনার নির্দিষ্ট ক্ষেত্রে, আপনি অতিরিক্ত কাজ করে সহজ কোড অর্জন করতে পারেন।

var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`

4
এটি দুর্দান্ত কাজ করে তবে এটি সমস্ত ম্যাচই ফিরে আসে যেখানে আমি যে গ্রেপ ব্যবহার করেছি কেবল প্রথম ম্যাচটিই ফিরে এসেছে। প্রথম ম্যাচটি কীভাবে ফিরবেন সে সম্পর্কে কোনও ধারণা?
কুগিয়ৌশা

4
@ আয়রিনটেনশন: | tail -1পাইপলাইনটির শেষে যুক্ত করুন ।
পিটার

grepসর্বদা সমস্ত মিলে যাওয়া লাইনগুলি ফেরত দেয় (আপনি যদি এমন কোনও বিকল্প ব্যবহার না করেন যেখানে এটি কোনওটিই প্রিন্ট করে না)। যাইহোক, if (/.../) { print $1; last; }এটি কেবল প্রথম ম্যাচটি মুদ্রণের কারণ ঘটাবে ।
ইকেগামী

সাইটম্যাপের ইউআরএলগুলি বের করার জন্য আমি এটি ব্যবহার করেছি - ধন্যবাদ সাথী, এটি আপনার পোস্ট ছাড়া তৈরি করতে পারত না! পার্ল-এনলে'প্রিন্ট if 1 যদি এম {<loc> (। *) </loc> site 'সাইটম্যাপ.এক্সএমএল
খ্রিস্টান

4
@ ক্রিশ্চিয়ান, এক্সএমএল :: লিবিএক্সএমএল এর মতো উপযুক্ত এক্সএমএল পার্সার দিয়ে কেবল এটি করতে 3 লাইন লাগবে। (মূল লাইন say $_->textContent for $doc->findnodes('//loc');:)
ইকেগামি

93

আপনার স্ক্রিপ্টের শুধুমাত্র আপনার ব্যবহারের জন্য হন, তাহলে আপনি ইনস্টল করতে পারেন grepথেকে homebrew-coreব্যবহার brew:

brew install grep 

তারপরে এটি ggrep(জিএনইউ grep) হিসাবে উপলব্ধ । এটি সিস্টেমে প্রতিস্থাপন করে না grep(আপনার সিস্টেমের আগে ইনস্টল করা গ্রেপ লাগানো দরকার PATH)।

দ্বারা ইনস্টল করা সংস্করণে বিকল্পটি brewঅন্তর্ভুক্ত রয়েছে -P, সুতরাং আপনার স্ক্রিপ্টগুলি পরিবর্তন করার দরকার নেই।

আপনার যদি এই কমান্ডগুলির সাধারণ নামগুলি ব্যবহার করার প্রয়োজন হয় তবে আপনি আপনার বাশার্ক থেকে আপনার রাস্তায় একটি "গনুবিন" ডিরেক্টরি যুক্ত করতে পারেন:

PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

আপনি এই লাইনটি আপনার keep / .bashrc বা session / .zshrc এ নতুন সেশনের জন্য রপ্তানি করতে পারবেন।

পুরানো বিকল্পের প্রো-এস এবং কনস এর আলোচনার জন্য দয়া করে এখানে দেখুন --with-default-namesএবং এটি (সাম্প্রতিক) অপসারণ।


4
@ পিপার কি কাজ করেনি? সম্ভবত পথ সঠিকভাবে সেট করা হয়নি - এর ফলাফল কী which grep? হওয়া উচিত /usr/local/bin/grep। এটি; সাবধানতার সাথে পরীক্ষা করে নেওয়ার আগে বোঝা যাচ্ছে যে কোনও সমস্যা আছে!
ড্রিভিকো

4
/usr/local/binআপনার পথের সামনের দিকে যুক্ত করা ভাল better আমি বিশ্বাস করি যে ব্রু সেট আপ করার কথা? আপনি ব্যবহার করেছেন --default-names? যাইহোক, আনন্দিত এটি কাজ করে (: এটি চারপাশে হ্যাকিং সম্পর্কে নিশ্চিত নয়, তবে আমি মনে করি যে সাইটটি এত ভাল সংস্থান হিসাবে পয়েন্ট সিস্টেম অন্যতম কারণ
ড্রেভিকো

4
হ্যাঁ আমি - ডিফল্ট-নাম এবং সংযুক্তি ব্যবহার করেছি। আপনার পথে সামনে / ইউএসআর / স্থানীয় / বিন স্থাপন করা কোনও উপনামের চেয়ে ভাল কিনা তা নিশ্চিত নন, কেবল বিকল্প
গোলমরিচ

10
এর বিকল্পটি --with-default-namesহ'ল alias grep='ggrep'আপনার ব্যাশ প্রোফাইলে যুক্ত করা এবং ব্রিউ
ডুপগুলি

4
--with-default-namesমিশ্রিত করা থেকে সরানো হয়। আমাকে brew install grepজিগ্রিপ পেতে হয়েছিল এবং তারপরে @ রিমো যা বলেছে তাই করবে alias grep='ggrep'
হেনহে

12

এসিসি ইনস্টল করুন এবং পরিবর্তে এটি ব্যবহার করুন। আক পার্ল লিখিত একটি গ্রেপ প্রতিস্থাপন। পার্ল নিয়মিত প্রকাশের জন্য এটির সম্পূর্ণ সমর্থন রয়েছে।


আমি এটি পরীক্ষা করে দেখতে চাই তবে এটি ওয়ার্ক কম্পিউটারের জন্য তাই আমরা কিছু ইনস্টল করতে পারি না
kugyousha

@ আয়রিনটেনশন: পার্ল মডিউলগুলি ইনস্টল করতে পারলে আপনি ভাল। এমনকি যদি আপনি স্থানীয় পার্ল ইনস্টলেশনটিতে যোগ করতে না পারেন তবে আপনি সর্বদা স্থানীয় :: লিব ব্যবহার করতে পারেন।
মাইকেল কারম্যান

ackস্বনির্ভর হতে ডিজাইন করা হয়েছে; আপনার এটি ইনস্টল করার দরকার নেই। আপনি যদি কোনও ফাইল সংরক্ষণ করতে পারেন, এটি এক্সটেকটেবল হিসাবে চিহ্নিত করুন এবং প্রয়োজনে নিজের আপডেট করুন PATH, আপনি যেতে ভাল।
ট্রিপলি

আপনি কি সেই এসিড সিনট্যাক্সটি খুশি করতে পারেন যা
উপরেরটি

@ ফুলডিসেন্ট: এটি প্রায় অভিন্ন: ack -o '(property:)\K.*\d+(?=end)' file.txt( -oএকই জিনিসটির অর্থ, তবে আপনার এসি -Pদিয়ে দরকার নেই )
মাইকেল কারম্যান

11

ওএস এক্স জিএনইউ সরঞ্জামগুলির চেয়ে বিএসডি সরবরাহ করে। এটি তবে আসবে না egrep, যা সম্ভবত রেজেেক্স অনুসন্ধান করার জন্য আপনার প্রয়োজন।

উদাহরণ: egrep 'fo+b?r' foobarbaz.txt

ওএসএক্স গ্রেপ ম্যান পৃষ্ঠা থেকে একটি স্নিপেট:

grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).


4
Egrep হিসাবে সরাসরি অনুরোধ হ্রাস করা হয়। একই ক্ষমতাটি গ্রেপ-ই হিসাবেও উপলব্ধ। এটা ... Perl একটি দু: খিত ছায়া, lookaround গবেষকেরা, ব্যাকস্ল্যাশ বেরিয়ে অধিকাংশ, বিকল্প, কন্ডিশন, ইত্যাদি :( পাওয়ার ব্যবহারকারীদের এটি ঘৃণা করবে উদাসীন, কিন্তু এটা অন্তত নেই কাজ।
Dewi থেকে মরগ্যান

4
ধন্যবাদ grep -Eপরিবর্তে grep -Pআমার প্রয়োজন ঠিক কি ছিল।
asmaier

6

use perl;

perl -ne 'print if /regex/' files ...

আপনার যদি আরও grepবিকল্পের প্রয়োজন হয় (আমি আপনাকে -oকমপক্ষে দেখতে চাই ) pgrepজালের চারপাশে বিভিন্ন বাস্তবায়ন ভেসে ওঠে, যার মধ্যে অনেকগুলি পার্লে রয়েছে।

যদি "প্রায় পার্ল" যথেষ্ট ভাল হয় তবে পিসিআরই শিপ করে pcregrep


5

অন্য বিকল্প নেই: pcregrep

প্যাকগ্রিপ পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন সহ একটি গ্রেপ । এর ঠিক একই ব্যবহার রয়েছে grep -P। সুতরাং এটি আপনার স্ক্রিপ্টগুলির সাথে সামঞ্জস্যপূর্ণ হবে।

এটি হোমব্রিউ দিয়ে ইনস্টল করা যেতে পারে:

brew install pcre


Error: No available formula for pcregrep
অ্যারন ব্র্যাজার

গ্যাবারমার্টন, আমি @ মার্টিনের সংশোধন করার মন্তব্যটি অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি সম্পাদনা করেছি এবং সর্বনিম্ন পরিবর্তনগুলি পেতে ফর্ম্যাটটি কিছুটা সরিয়ে নিতে হয়েছিল।
ড্যানিয়েল বেয়ার্ড

3

'-E' বিকল্পটি কীভাবে ব্যবহার করবেন? এটা আমার জন্য কাজ করে জরিমানা, উদাহরণস্বরূপ, যদি আমি একটি জন্য চেক করতে চান php_zip, php_xml, php_gd2থেকে এক্সটেনশন পিএইচপি -m আমি ব্যবহার:

php -m | grep -E '(zip|xml|gd2)'

4
এইটা কাজ করে. ম্যাক ফ্রিবিএসডি
গ্রেপ

2

গৃহীত উত্তরের সমতুল্য, তবে -পি সুইচটির প্রয়োজনীয়তা ছাড়াই, যা আমার কাছে উপলব্ধ দুটি মেশিনে উপস্থিত ছিল না।

find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'



0

পাইপের সাহায্যে ফলাফল খুঁজে পাওয়ার মাধ্যমে পার্ল ওয়ান-লাইনার রেজেক্স ব্যবহার করুন। আমি ব্যবহৃত lookbehind (পেতে src HTML এ লিঙ্ক) এবং lookahead জন্য " এবং এটি কার্ল (HTML) আউটপুট পাশ করে।

bash-3.2# curl stackoverflow.com | perl -0777 -ne '$a=1;while(m/(?<=src\=\")(.*)(?=\")/g){print "Match #".$a." "."$&\n";$a+=1;}'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  239k  100  239k    0     0  1911k      0 --:--:-- --:--:-- --:--:-- 1919k
Match #1 //ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
Match #2 //cdn.sstatic.net/Js/stub.en.js?v=fb6157e02696
Match #3 https://ssum-sec.casalemedia.com/usermatch?s=183712&amp;cb=https%3A%2F%2Fengine.adzerk.net%2Fudb%2F22%2Fsync%2Fi.gif%3FpartnerId%3D1%26userId%3D
Match #4 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/elasticsearch-2.0" class="post-tag" title="show questions tagged &#39;elasticsearch-2.0&#39;" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged &#39;elasticsearch-dsl&#39;" rel="tag
Match #5 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/sharding" class="post-tag" title="show questions tagged &#39;sharding&#39;" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged &#39;master&#39;" rel="tag
Match #6 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/linux" class="post-tag" title="show questions tagged &#39;linux&#39;" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged &#39;camera&#39;" rel="tag
Match #7 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/firebase" class="post-tag" title="show questions tagged &#39;firebase&#39;" rel="tag"><img src="//i.stack.imgur.com/5d55j.png" height="16" width="18" alt="" class="sponsor-tag-img">firebase</a> <a href="/questions/tagged/firebase-authentication" class="post-tag" title="show questions tagged &#39;firebase-authentication&#39;" rel="tag
Match #8 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/ios" class="post-tag" title="show questions tagged &#39;ios&#39;" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged &#39;in-app-purchase&#39;" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged &#39;piracy-protection&#39;" rel="tag
Match #9 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/unity3d" class="post-tag" title="show questions tagged &#39;unity3d&#39;" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged &#39;vr&#39;" rel="tag
Match #10 http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif" alt="" class="dno
bash-3.2# date
Mon Oct 24 20:57:11 EDT 2016
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.