grep -P는 더 이상 작동하지 않습니다. 검색을 다시 작성하려면 어떻게해야합니까?


98

새 버전의 OSX가 더 이상 지원하지 않아서 grep -P일부 스크립트가 작동 하지 않는 것 같습니다 .

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

grep을 변수로 캡처해야하며 너비가 0 인 어설 션을 사용해야합니다. \K

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

어떤 대안이라도 대단히 감사하겠습니다.


8
gnu grep 설치는 어떻습니까?
Kent

그것이 확실 -P합니까? 내 것이있다.
Kevin

4
@Kevin 10.8에서 제거되었습니다.
Lri

8
@ AdrianFrühwirth OS X는 grep실제로 grep (GNU grep) 2.5.110.7 grep (BSD grep) 2.5.1-FreeBSD에서 10.8로 변경되었습니다 . GPL 때문인 것 같습니다. FreeBSD grep는 또한 GNU를 기반으로 grep하며 두 버전 모두 grep2002 년에 있습니다. --label그리고 -u/ --unix-byte-offets도 10.8에서 제거되었습니다. -z/ --decompress, -J/ --bz2decompress, --exclude-dir, --include-dir, -S, -O, 및 -p10.8에 추가되었습니다. -Z에서 --null로 변경되었습니다 --decompress.
Lri

3
grepOS X와 ​​함께 제공 되는 FreeBSD 는 2002 년의 것이며 wiki.freebsd.org/BSDgrep은 여전히 "유일한 TODO 항목은 성능을 향상시키는 것"이라고 말합니다. 그렇습니다. time grep aa /usr/share/dict/words>/dev/null내 iMac에서 반복적으로 실행할 때 OS X의 grep에서는 약 0.09 초, 새로운 GNU grep에서는 약 0.01 초가 걸립니다.
Lri

답변:


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`

1
이것은 훌륭하게 작동하지만 내가 사용한 grep이 첫 번째 일치 만 반환 한 모든 일치를 반환합니다. 첫 번째 경기 만 반환하는 방법에 대한 아이디어가 있습니까?
kugyousha

1
@ironintention : | tail -1파이프 라인 끝에 추가 합니다.
Peter

grep항상 일치하는 모든 줄을 반환합니다 (아무것도 인쇄하지 않는 옵션 중 하나를 사용하지 않는 한). 어쨌든 if (/.../) { print $1; last; }첫 번째 일치 만 인쇄합니다.
ikegami

나는 이것을 사용하여 사이트 맵의 URL을 얻었습니다-고마워요, 당신의 게시물 없이는 만들지 못했을 것입니다! perl -nle'print $ 1 if m {<loc> (. *) </ loc>} 'sitemap.xml
Christian

2
@Christian, XML :: LibXML과 같은 적절한 XML 파서로 3 줄만 사용하면됩니다. (키 라인 : say $_->textContent for $doc->findnodes('//loc');)
이케 가미

92

스크립트가 사용자 전용 인 경우 다음 grephomebrew-core사용하여 설치할 수 있습니다 brew.

brew install grep 

그런 다음 ggrep(GNU grep) 로 사용할 수 있습니다 . 시스템을 대체하지 않습니다 grep(설치된 grep을에서 시스템 하나 앞에 넣어야합니다 PATH).

에서 설치 한 버전 brew에는 -P옵션 이 포함되어 있으므로 스크립트를 변경할 필요가 없습니다.

이러한 명령을 일반 이름으로 사용해야하는 경우 다음과 같이 bashrc에서 PATH에 "gnubin"디렉토리를 추가 할 수 있습니다.

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

이 줄을 ~ / .bashrc 또는 ~ / .zshrc에 내 보내서 새 세션을 위해 유지할 수 있습니다.

이전 옵션의 장단점 과 (최근) 제거 에 대한 논의는 여기 를 참조 하십시오--with-default-names .


3
@pepper 작동하지 않은 것은 무엇입니까? 경로가 제대로 설정되지 않은 것 같습니다. 출력은 which grep무엇입니까? 이어야 /usr/local/bin/grep합니다. 문제가 있는지주의 깊게 확인하기 전에 반대표를 던지는 것은 약간 의미가 있습니다!
drevicko 2014 년

2
아마도 /usr/local/binPATH 앞에 추가 하는 것이 좋습니다 . BREW가 그것을 설정해야한다고 생각합니까? 사용 했습니까 --default-names? 어쨌든, 다행 그것은 (작동합니다 확실하지 주위 해킹에 대해,하지만 포인트 시스템이 이유 중 하나라고 생각이 사이트와 같은 좋은 자원.
drevicko

1
예, --default-names 및 brew를 사용했습니다. 확실하지 경로의 앞에 / usr / 지방 / 빈 퍼팅, 그냥 다른 별칭보다 더 나은 경우
고추가

10
대안 --with-default-namesalias grep='ggrep'bash 프로필 에 추가 하고 brew
dupes

4
--with-default-names양조장에서 제거됩니다. 나는 brew install grepggrep을 얻어야했다. 그리고 @rymo가 말하고하는대로해야했다 alias grep='ggrep'.
Henge 19

12

ack를 설치 하고 대신 사용하십시오. Ack는 Perl로 작성된 grep 대체입니다. Perl 정규식을 완벽하게 지원합니다.


확인하고 싶지만 이것은 업무용 컴퓨터 용이므로 아무것도 설치할 수 없습니다
kugyousha

@ironintention : Perl 모듈을 설치할 수 있다면 좋습니다. 로컬 Perl 설치에 추가 할 수 없더라도 항상 local :: lib를 사용할 수 있습니다.
Michael Carman

ack독립적으로 설계되었습니다. 실제로 설치할 필요가 없습니다. 파일을 저장할 수 있고 예상 가능으로 표시하고 PATH필요한 경우 업데이트 할 수 있다면 좋습니다.
tripleee 2014 년

당신은 위의 대체 ACK 구문 기쁘게 할 수
윌리엄 Entriken

@FullDecent는 : 그것은 거의 동일입니다 ack -o '(property:)\K.*\d+(?=end)' file.txt( -o같은 것을 의미하지만, 당신은 필요하지 않습니다 -PACK와 함께)
마이클 전차 승무원

11

OS X는 GNU 도구보다는 BSD를 제공하는 경향이 있습니다. 그것은 않습니다 와 함께 egrep당신은 정규식 검색을 수행 할 필요가 아마 인, 그러나.

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

OSX grep man 페이지의 일부 :

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


5
egrep으로 직접 호출은 더 이상 사용되지 않습니다. grep -E와 동일한 기능을 사용할 수도 있습니다. 그것은 ... Perl의 슬픈 그림자, 둘러보기 단언, 대부분의 백 슬래시 이스케이프, 옵션, 조건문 등 :( 파워 유저는 그것을 싫어할 것이지만 적어도 일을합니다.
Dewi Morgan

1
감사. grep -E대신 grep -P내가 필요한 것이 었습니다.
asmaier

6

use perl;

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

더 많은 grep옵션 이 필요하다면 ( -o적어도 원할 것 같네요 ) 다양한 pgrep구현이 네트워크 주위에 떠 다니고 있으며, 그 중 대부분은 Perl에 있습니다.

"거의 Perl"이 충분하다면 PCRE는 pcregrep.


5

다른 대안이 있습니다 : pcregrep.

Pcregrep 은 Perl 호환 정규 표현식을 사용하는 grep입니다. 그것은 grep -P. 따라서 스크립트와 호환됩니다.

homebrew와 함께 설치할 수 있습니다.

brew install pcre


Error: No available formula for pcregrep
Aaron Brager

GaborMarton, @Martin의 수정 주석을 포함하도록 답변을 편집했으며 최소 변경 사항을 극복하기 위해 서식을 약간 이동해야했습니다.
Daniel Baird

3

'-E'옵션을 사용하는 것은 어떻습니까? 내가 확인하고 싶은 경우는, 예를 들어, 나를 위해 잘 작동 php_zip, php_xml, php_gd2에서 확장 PHP는 -m의 I 사용 :

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

1
작동합니다. Mac은 FreeBSD grep을 사용하고 Linux는 GNU grep을 사용합니다. 그래서이 수정은 내 macOS sierra에서 작동했습니다
jimh

2

받아 들인 대답과 동일하지만 -P 스위치가 필요하지 않았습니다. 이는 두 컴퓨터 모두에 없었습니다.

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

2

이것은 나를 위해 일했습니다.

    awk  -F":" '/PATTERN/' file.txt

0

-P에 대한 또 다른 Perl 솔루션

var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)

0

파이프로 find 출력을 전달하여 perl 한 줄 정규식을 사용하십시오. 나는 lookbehind ( html에서 src 링크 가져 오기 )를 사용하고 "에 대한 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.