Wygląda na to, że nowa wersja OSX nie obsługuje już grep -P
i w związku z tym niektóre z moich skryptów przestały działać.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Muszę przechwycić grep do zmiennej i muszę użyć asercji o zerowej szerokości, jak również \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Wszelkie alternatywy byłyby bardzo mile widziane.
-P
? Mój to ma.grep
faktycznie zmienił się zgrep (GNU grep) 2.5.1
10.7 dogrep (BSD grep) 2.5.1-FreeBSD
10.8. Myślę, że to z powodu GPL. FreeBSDgrep
jest również oparte na GNUgrep
i obie wersjegrep
pochodzą z 2002 roku--label
i-u
/--unix-byte-offets
zostały również usunięte w 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, I-p
dodano 10,8.-Z
zmieniono z--null
na--decompress
.grep
które jest dostarczane z OS X pochodzi z 2002 roku, a wiki.freebsd.org/BSDgrep nadal mówi, że „jedyna pozycja TODO poprawia wydajność”, więc tak.time grep aa /usr/share/dict/words>/dev/null
zajmuje około 0,09 sekundy w przypadku programu grep w systemie OS X i około 0,01 sekundy w przypadku nowego programu GNU grep przy powtarzających się uruchomieniach na moim iMacu.Odpowiedzi:
Jeśli chcesz wykonać minimalną ilość pracy, zmień
grep -P 'PATTERN' file.txt
do
perl -nle'print if m{PATTERN}' file.txt
i zmienić
grep -o -P 'PATTERN' file.txt
do
perl -nle'print $& while m{PATTERN}g' file.txt
Otrzymujesz więc:
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`
W twoim konkretnym przypadku możesz uzyskać prostszy kod przy dodatkowej pracy.
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt` var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
źródło
| tail -1
na końcu potoku.grep
zawsze zwraca wszystkie pasujące wiersze (chyba że używasz jednej z opcji, w których w ogóle nie wyświetla żadnego). W każdym razieif (/.../) { print $1; last; }
spowoduje to wydrukowanie tylko pierwszego dopasowania.say $_->textContent for $doc->findnodes('//loc');
)Jeśli Twoje skrypty są przeznaczone tylko do Twojego użytku, możesz zainstalować
grep
jehomebrew-core
za pomocąbrew
:brew install grep
Wtedy jest dostępny jako
ggrep
(GNUgrep
). nie zastępuje systemugrep
(musisz umieścić zainstalowany grep przed systememPATH
).Wersja zainstalowana przez
brew
zawiera-P
opcję, więc nie musisz zmieniać swoich skryptów.Jeśli potrzebujesz użyć tych poleceń z ich normalnymi nazwami, możesz dodać katalog „gnubin” do swojej PATH z poziomu bashrc, na przykład:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
Możesz wyeksportować tę linię do swojego ~ / .bashrc lub ~ / .zshrc, aby zachować ją dla nowych sesji.
Proszę zobaczyć tutaj, aby omówić zalety i wady starej
--with-default-names
opcji oraz jej (niedawnego) usunięcia.źródło
which grep
? Powinien być/usr/local/bin/grep
. Jest to trochę trudne do zagłosowania, zanim dokładnie sprawdzisz, czy jest problem!/usr/local/bin
na początku ścieżki PATH. Wierzę, że Brew ma to ustawić? Czy używałeś--default-names
? W każdym razie cieszę się, że to działa (: Nie jestem pewien co do hakowania wokół niego, ale myślę, że system punktów jest jednym z powodów, dla których ta strona jest tak dobrym źródłem.--with-default-names
jest dodaniealias grep='ggrep'
do profilu basha i pozwolenie--with-default-names
jest usuwany z naparu. Musiałembrew install grep
zdobyć ggrep, a następnie zrobić to, co mówi @rymoalias grep='ggrep'
.Zainstaluj ACK i używaj go zamiast tego. Ack to zamiennik grepa napisany w Perlu. Posiada pełne wsparcie dla wyrażeń regularnych Perla.
źródło
ack
jest zaprojektowany jako samodzielny; nie musisz go faktycznie instalować. Jeśli możesz zapisać plik, oznaczyć go jako możliwy do wykonania i zaktualizować wPATH
razie potrzeby, możesz zaczynać .ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
oznacza to samo, ale nie potrzebujesz potwierdzenia-P
)OS X dostarcza raczej narzędzi BSD niż GNU. To nie dysponują
egrep
jednak, co jest chyba wszystko, co trzeba wykonać regex wyszukiwania.przykład:
egrep 'fo+b?r' foobarbaz.txt
Fragment ze strony podręcznika grep dla systemu OSX:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
źródło
grep -E
zamiast tegogrep -P
był dokładnie tym, czego potrzebowałem.use perl;
perl -ne 'print if /regex/' files ...
Jeśli potrzebujesz więcej
grep
opcji (widzę, że chciałbyś-o
przynajmniej),pgrep
w sieci krążą różne implementacje, z których wiele jest w Perlu.Jeśli „prawie Perl” jest wystarczająco dobre, PCRE jest dostarczane z
pcregrep
.źródło
Jest jeszcze inna alternatywa:
pcregrep
.Pcregrep to grep z wyrażeniami regularnymi kompatybilnymi z Perl. Ma dokładnie takie samo zastosowanie jak
grep -P
. Więc będzie kompatybilny z twoimi skryptami.Można go zainstalować za pomocą homebrew:
brew install pcre
źródło
Error: No available formula for pcregrep
Co powiesz na użycie opcji „-E”? Działa to dobrze dla mnie, na przykład, jeśli chcę, aby sprawdzić, czy
php_zip
,php_xml
,php_gd2
rozszerzenie z php -m używam:php -m | grep -E '(zip|xml|gd2)'
źródło
Odpowiednik zaakceptowanej odpowiedzi, ale bez wymogu przełącznika -P, którego nie było na obu komputerach, które miałem do dyspozycji.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
źródło
Ten pracował dla mnie:
awk -F":" '/PATTERN/' file.txt
źródło
Kolejne rozwiązanie Perla dla -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
źródło
użyj jednowierszowego wyrażenia regularnego perl, przekazując wynik wyszukiwania potokiem. Użyłem lookbehind (pobierz linki src w html) i lookahead dla „ i przekazałem do niego wynik 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
źródło