perl-regex в BSD grep как против GNU grep [duplicate]

На github есть Feature Request: цвета темы доступа в файлах стилуса

@KaelWD (один из разработчиков) написал :

Это то, что вам нужно реализовать самостоятельно. Я попытался сделать что-то подобное раньше, но на самом деле он не работает на уровне фрейма.

Проблема помечена как wontfix

51
задан kugyousha 20 May 2013 в 21:59
поделиться

11 ответов

Если вы хотите выполнить минимальный объем работы, измените

grep -P 'PATTERN' file.txt

на

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

и измените

grep -o -P 'PATTERN' file.txt

на

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

Итак, вы получаете:

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

В вашем конкретном случае вы можете получить более простой код с дополнительной работой.

var1=`perl -nle 'print $1 if m{<st:italic>(.*)</italic>}' file.txt`
var2=`perl -nle 'print $1 if /property:(.*\d+)end/' file.txt`
42
ответ дан ikegami 25 August 2018 в 07:35
поделиться

Существует еще одна альтернатива: pcregrep.

Pcregrep является grep с регулярными выражениями, совместимыми с Perl. Он имеет то же значение, что и grep -P. Таким образом, он будет совместим с вашими сценариями.

Он может быть установлен с доморощенным:

brew install pcre

5
ответ дан Daniel Baird 25 August 2018 в 07:35
поделиться

Если ваши сценарии предназначены только для вашего использования, вы можете установить grep из homebrew-core , используя brew :

brew install grep --with-default-names

Когда вы укажете --with-default-names, он заменяет систему grep (фактически, ставит установленный grep перед системой один на PATH).

Версия, установленная brew, включает в себя параметр -P, поэтому вам не нужно менять свои скрипты.

Если вы устанавливаете без --with-default-names, тогда он доступен как ggrep (GNU grep).

54
ответ дан lukad 25 August 2018 в 07:35
поделиться

Установите ack и используйте его вместо этого. Ack - это замена grep, написанная на Perl. Он полностью поддерживает регулярные выражения Perl.

11
ответ дан Michael Carman 25 August 2018 в 07:35
поделиться

OS X имеет тенденцию предоставлять BSD, а не инструменты GNU. Он действительно работает с egrep, но это, вероятно, все, что вам нужно для выполнения поиска в регулярном выражении.

example: egrep 'fo+b?r' foobarbaz.txt

Отрывок из страницы руководства OSG grep:

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

8
ответ дан nebulous 25 August 2018 в 07:35
поделиться

Эквивалент принятого ответа, но без требования переключателя -P, который отсутствовал на обеих машинах, я был доступен.

find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
2
ответ дан Nuzzolilo 25 August 2018 в 07:35
поделиться

Это работало для меня:

    awk  -F":" '/PATTERN/' file.txt
2
ответ дан petegam 25 August 2018 в 07:35
поделиться

используют регулярное выражение perl one-liner, передавая вывод find с помощью трубы. Я использовал lookbehind (получить ссылки src в html) и lookahead для "и передал ему вывод curl (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
0
ответ дан Rohit Malgaonkar 25 August 2018 в 07:35
поделиться

Другое решение Perl для -P

var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
0
ответ дан Rory Hunter 25 August 2018 в 07:35
поделиться

use perl;

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

Если вам нужно больше опций grep (я вижу, что вы, по крайней мере, хотели бы -o), существуют различные pgrep реализации, плавающие вокруг сети, многие из них их в Perl.

Если «почти Perl» достаточно хорош, PCRE поставляется с pcregrep.

6
ответ дан tripleee 25 August 2018 в 07:35
поделиться

Как насчет использования опции «-E»? Он отлично работает для меня, например, если я хочу проверить расширение php_zip, php_xml, php_gd2 от php -m, я использую:

php -m | grep -E '(zip|xml|gd2)'
3
ответ дан zx485 25 August 2018 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: