Похоже, новая версия OSX больше не поддерживает, grep -P
и поэтому некоторые из моих скриптов перестали работать.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Мне нужно записать grep в переменную, и мне нужно использовать утверждения нулевой ширины, а также \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Приветствуются любые альтернативы.
-P
? У меня это есть.grep
фактически изменилась сgrep (GNU grep) 2.5.1
версии 10.7 на версиюgrep (BSD grep) 2.5.1-FreeBSD
10.8. Я думаю, это было из-за GPL. FreeBSDgrep
также основана на GNU,grep
и обе версииgrep
относятся к 2002 г.--label
и-u
/--unix-byte-offets
также были удалены в 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, И-p
были добавлены в 10,8.-Z
изменено с--null
на--decompress
.grep
, поставляемая с OS X, выпущена в 2002 году, и wiki.freebsd.org/BSDgrep по- прежнему говорит, что «единственный элемент TODO - повышение производительности», так что да.time grep aa /usr/share/dict/words>/dev/null
занимает около 0,09 секунды с grep в OS X и около 0,01 секунды с новым GNU grep при повторных запусках на моем iMac.Ответы:
Если вы хотите выполнить минимальный объем работы, измените
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`
источник
| tail -1
в конец конвейера.grep
всегда возвращает все совпадающие строки (если вы не используете один из вариантов, при котором он вообще не печатает). В любом случае,if (/.../) { print $1; last; }
он будет печатать только первое совпадение.say $_->textContent for $doc->findnodes('//loc');
)Если ваши скрипты только для личного использования, вы можете установить
grep
сhomebrew-core
помощьюbrew
:brew install grep
Тогда он доступен как
ggrep
(GNUgrep
). он не заменяет системуgrep
(вам нужно поставить установленный grep перед системнымPATH
).Версия, установленная с помощью,
brew
включает эту-P
опцию, поэтому вам не нужно изменять скрипты.Если вам нужно использовать эти команды с их обычными именами, вы можете добавить каталог «gnubin» в свой PATH из вашего bashrc, например:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
Вы можете экспортировать эту строку в свой ~ / .bashrc или ~ / .zshrc, чтобы сохранить ее для новых сеансов.
Пожалуйста, смотрите здесь обсуждение плюсов и минусов старого
--with-default-names
варианта и его (недавнего) удаления.источник
which grep
? Должно быть/usr/local/bin/grep
. Это немного означало бы проголосовать против, прежде чем вы внимательно проверите, есть ли проблема!/usr/local/bin
в начало вашего PATH. Я полагаю, пив должен установить это? Вы использовали--default-names
? Во всяком случае, рад, что он работает (: Не уверен, что насчет этого, но я думаю, что балльная система - одна из причин, по которой этот сайт является таким хорошим ресурсом.--with-default-names
- добавитьalias grep='ggrep'
в свой профиль на bash и позволить brew dupes сохранять свой префикс--with-default-names
удаляется из заварки. Мне пришлосьbrew install grep
получить ggrep, а затем сделать, как говорит и делать @rymoalias grep='ggrep'
.Установите ack и используйте его. Ack - это замена grep, написанная на Perl. Он полностью поддерживает регулярные выражения Perl.
источник
ack
разработан, чтобы быть автономным; вам не нужно его устанавливать. Если вы можете сохранить файл, пометить его как исполняемый иPATH
при необходимости обновить его, все готово .ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
означает то же самое, но вам не нужен-P
с ack)OS X имеет тенденцию предоставлять инструменты BSD, а не GNU. Однако он есть
egrep
, и это, вероятно, все, что вам нужно для выполнения поиска по регулярным выражениям.пример:
egrep 'fo+b?r' foobarbaz.txt
Фрагмент справочной страницы OSX grep:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
источник
grep -E
вместоgrep -P
было именно то, что мне было нужно.use perl;
perl -ne 'print if /regex/' files ...
Если вам нужно больше
grep
опций (я вижу, вы,-o
по крайней мере, хотели бы), в сети ходят различныеpgrep
реализации, многие из которых на Perl.Если "почти Perl" достаточно хорош, PCRE поставляется с
pcregrep
.источник
Существует еще одна альтернатива:
pcregrep
.Pcregrep - это grep с регулярными выражениями, совместимыми с Perl. Он используется точно так же, как
grep -P
. Так что он будет совместим с вашими скриптами.Его можно установить с помощью homebrew:
brew install pcre
источник
Error: No available formula for pcregrep
Как насчет использования опции '-E'? Он отлично работает для меня, например, если я хочу проверить для
php_zip
,php_xml
,php_gd2
расширение из PHP -m я использую:php -m | grep -E '(zip|xml|gd2)'
источник
Эквивалент принятого ответа, но без использования переключателя -P, которого не было на обеих машинах, которые у меня были.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
источник
Это сработало для меня:
awk -F":" '/PATTERN/' file.txt
источник
Еще одно решение Perl для -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
источник
используйте однострочное регулярное выражение perl, передав вывод 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&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
источник