Sepertinya versi baru OSX tidak lagi mendukung grep -P
dan karena itu telah membuat beberapa skrip saya berhenti berfungsi.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Saya perlu menangkap grep ke variabel dan saya perlu menggunakan pernyataan lebar nol, juga \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Alternatif apa pun akan sangat dihargai.
-P
? Punyaku memilikinya.grep
sebenarnya berubah darigrep (GNU grep) 2.5.1
10.7 menjadigrep (BSD grep) 2.5.1-FreeBSD
10.8. Saya kira itu karena GPL. FreeBSDgrep
juga berdasarkan GNUgrep
dan kedua versigrep
dari 2002.--label
dan-u
/--unix-byte-offets
juga dihapus pada 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, Dan-p
ditambahkan di 10,8.-Z
diubah dari--null
menjadi--decompress
.grep
yang disertakan dengan OS X berasal dari tahun 2002, dan wiki.freebsd.org/BSDgrep masih mengatakan bahwa "satu-satunya item TODO adalah meningkatkan kinerja", jadi ya.time grep aa /usr/share/dict/words>/dev/null
membutuhkan sekitar 0,09 detik dengan grep OS X dan sekitar 0,01 detik dengan grep GNU baru saat berjalan berulang kali di iMac saya.Jawaban:
Jika Anda ingin melakukan sedikit pekerjaan, ubahlah
grep -P 'PATTERN' file.txt
untuk
perl -nle'print if m{PATTERN}' file.txt
dan berubah
grep -o -P 'PATTERN' file.txt
untuk
perl -nle'print $& while m{PATTERN}g' file.txt
Jadi Anda mendapatkan:
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`
Dalam kasus khusus Anda, Anda dapat mencapai kode yang lebih sederhana dengan pekerjaan ekstra.
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt` var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
sumber
| tail -1
ke ujung pipeline.grep
selalu mengembalikan semua baris yang cocok (kecuali jika Anda menggunakan salah satu opsi yang tidak mencetak sama sekali). Bagaimanapun,if (/.../) { print $1; last; }
akan menyebabkannya hanya mencetak pertandingan pertama.say $_->textContent for $doc->findnodes('//loc');
)Jika skrip Anda hanya untuk Anda gunakan, Anda dapat menginstal
grep
darihomebrew-core
menggunakanbrew
:brew install grep
Kemudian tersedia sebagai
ggrep
(GNUgrep
). itu tidak menggantikan sistemgrep
(Anda harus meletakkan grep yang diinstal sebelum sistem diPATH
).Versi yang diinstal oleh
brew
menyertakan-P
opsi, jadi Anda tidak perlu mengubah skrip Anda.Jika Anda perlu menggunakan perintah ini dengan nama normalnya, Anda dapat menambahkan direktori "gnubin" ke PATH Anda dari bashrc seperti:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
Anda dapat mengekspor baris ini di ~ / .bashrc atau ~ / .zshrc Anda untuk menyimpannya untuk sesi baru.
Silakan lihat di sini untuk diskusi tentang pro dan kontra dari
--with-default-names
opsi lama dan penghapusan (baru-baru ini).sumber
which grep
? Seharusnya/usr/local/bin/grep
. Sedikit bermaksud untuk memberi suara negatif sebelum Anda memeriksa dengan cermat bahwa ada masalah!/usr/local/bin
bagian depan PATH Anda. Bir seharusnya mengaturnya, saya percaya? Apakah Anda menggunakan--default-names
? Bagaimanapun, senang itu berhasil (: Tidak yakin tentang peretasan di sekitarnya, tetapi saya pikir sistem poin adalah salah satu alasan mengapa situs ini adalah sumber daya yang baik.--with-default-names
adalah menambahkanalias grep='ggrep'
ke profil bash Anda dan membiarkan pembuat minuman menipu tetap menggunakan awalan mereka--with-default-names
dihapus dari minuman. Saya harusbrew install grep
mendapatkan ggrep dan kemudian melakukan apa yang @rymo katakan dan lakukanalias grep='ggrep'
.Instal ack dan gunakan sebagai gantinya. Ack adalah pengganti grep yang ditulis di Perl. Ini memiliki dukungan penuh untuk ekspresi reguler Perl.
sumber
ack
dirancang untuk menjadi mandiri; Anda tidak perlu menginstalnya. Jika Anda dapat menyimpan file, tandai sebagai exectutable, dan perbaruiPATH
jika perlu, Anda siap melakukannya.ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
artinya sama, tetapi Anda tidak perlu-P
dengan ack)OS X cenderung menyediakan alat BSD daripada GNU. Itu memang datang dengan
egrep
, yang mungkin saja Anda butuhkan untuk melakukan pencarian regex.contoh:
egrep 'fo+b?r' foobarbaz.txt
Cuplikan dari halaman manual grep OSX:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
sumber
grep -E
bukangrep -P
apa yang saya butuhkan.use perl;
perl -ne 'print if /regex/' files ...
Jika Anda membutuhkan lebih banyak
grep
opsi (saya melihat Anda ingin-o
setidaknya) ada berbagaipgrep
implementasi yang mengambang di internet, banyak di antaranya di Perl.Jika "hampir Perl" cukup baik, PCRE dikirimkan bersama
pcregrep
.sumber
Ada alternatif lain:
pcregrep
.Pcregrep adalah grep dengan ekspresi reguler yang kompatibel dengan Perl. Ini memiliki penggunaan yang sama persis dengan
grep -P
. Jadi itu akan kompatibel dengan skrip Anda.Itu dapat diinstal dengan homebrew:
brew install pcre
sumber
Error: No available formula for pcregrep
Bagaimana jika menggunakan opsi '-E'? Ia bekerja dengan baik bagi saya, misalnya, jika saya ingin memeriksa untuk
php_zip
,php_xml
,php_gd2
ekstensi dari php-m saya gunakan:php -m | grep -E '(zip|xml|gd2)'
sumber
Setara dengan jawaban yang diterima, tetapi tanpa persyaratan sakelar -P, yang tidak ada di kedua mesin yang saya miliki.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
sumber
Yang ini berhasil untuk saya:
awk -F":" '/PATTERN/' file.txt
sumber
Solusi Perl lain untuk -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
sumber
menggunakan regex satu baris perl dengan melewatkan keluaran find dengan sebuah pipa. Saya menggunakan lookbehind (dapatkan link src di html) dan lookahead untuk " dan meneruskan keluaran curl (html) padanya.
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&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 'elasticsearch-2.0'" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged 'elasticsearch-dsl'" 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 'sharding'" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged 'master'" 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 'linux'" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged 'camera'" 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 'firebase'" 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 'firebase-authentication'" 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 'ios'" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged 'in-app-purchase'" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged 'piracy-protection'" 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 'unity3d'" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged 'vr'" 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
sumber