grep이 다음 공백까지 일치하는 단어를 표시하지 않는 이유는 무엇입니까?

grep이 다음 공백까지 일치하는 단어를 표시하지 않는 이유는 무엇입니까?

파일이 있는데 전체 단어가 아닌 패턴과 일치하는 유일한 단어를 temp원합니다 . grep시도했지만 grep -o <pattern> file원하는 결과가 나오지 않았습니다.

입력하다

xi29 vddf vss vddf vss int_s s2 rstb mg91a02_l_nd2_bulk_vt1 ln1=16n ln2=16n lp1=16n lp2=16n nf_n1=1 nf_n2=1 nf_p1=1 nf_p2=1  
xi28 vddf vss vddf vss d1 d mg91a02_l_inv_bulk_vt1 ln=16n lp=16n nf_n=1 nf_p=1 nfin_n=2 nfin_p=2 m=1  
xi25 vddf vss vddf vss int_m2 int_m1 mg91a02_l_inv_bulk_vt1 ln=16n lp=16n nf_n=1 nf_p=1 

주문하다

grep -o 'mg91a02' temp

출력(가져오기)

mg91a02
mg91a02
mg91a02

출력 (필수)

mg91a02_l_nd2_bulk_vt1
mg91a02_l_inv_bulk_vt1
mg91a02_l_inv_bulk_vt1

답변1

노력하다

 grep -E -o 'mg91a02\w+' 

어디

  • -E: 확장 정규식
  • -o 일치하는 단어만 인쇄
  • \w:단어문자(영숫자 또는 밑줄, 동의어 [_[:alnum:]]).
  • +한 번 이상

공백이 아닌 문자의 경우 @주석을 기반으로 문자열을 캡처 하려면 \S(약어 [^[:space:]]) 를 참조하세요.

grep -E -o 'mg91a02\S+'

OP의 편집된 입력을 사용하면 결과는 다음과 같습니다.

mg91a02_l_inv_bulk_vt1
mg91a02_l_nd2_bulk_vt1
mg91a02_l_nd2_@bulk!_vt1
mg91a02_l_nd2_[bulk]_vt1
mg91a02_l_inv_bulk_vt1

-o, \w및 는 \S비표준 확장자입니다.

답변2

grep -o 'mg91a02[^ ]*' file

이는 첫 번째 공백이 더 이상 보이지 않을 mg91a02때까지 패턴을 인쇄하거나 ( ) 공백이 아닌 모든 것을 인쇄하는 것을 의미합니다.^[^ ]

답변3

Perl 정규식 사용:

grep -Po '\w*mg91a02\w*'

예를 들어:

$ grep -Po top .zshrc
top
top
top
top
top
top
top
$ grep -Po '\w*top\w*' .zshrc
setopt
setopt
autopushd
setopt
setopt
setopt
setopt

관련 정보