GNU grep -P와 함께 perl 호환 정규식 사용


10

(?<=\[')[^,]*다음 줄을 포함하는 파일 에서이 정규식 을 사용하고 있습니다.disk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

나는 그것을 돌려주고 싶다 OVS/sdasd/asdasd/asdasd/something.img

어떻게 grep작동하게합니까?

시도 grep -P "(?<=\[')[^,]*"했지만 전체 줄을 반환합니다.

답변:


14

Grepping하려는 패턴과 일치 -o하는 grep것만 반환 하도록 스위치를 추가하십시오 .

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

6

sed이식성을 높이기 위해 둘러보기 어설 션없이 사용할 -o수도 있습니다 (에서 사용할 수없는 경우도 있음 grep).

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

여기서 백 슬래시 이스케이프의 "이상한"사용에 주목하십시오. sed기본적으로 BRE 를 사용 한다는 사실 때문입니다 ( 이 질문 참조 ).

이식성에 관해서는, 왜 Perl을 사용하지 않습니까?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

2

@slm은 이미 정식 답변을 제공했습니다. 몇 가지 옵션이 더 있습니다 :

awk'필드 구분 기호로 사용 (모든 행의 형식이 동일하다고 가정) :

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

펄에서 모든 일을하십시오 :

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

더 간단한 정규식을 사용하고 결과를 구문 분석하십시오.

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.