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

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

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

그게 돌아왔으면 좋겠어OVS/sdasd/asdasd/asdasd/something.img

grep작동하게 하려면 어떻게 사용하나요 ?

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

답변1

찾고 있는 패턴과 일치하는 항목만 반환 -o하도록 스위치 를 추가하세요 .grep

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

답변2

sed이식성을 높이기 위해 Lookaround 어설션 없이 사용할 수도 있습니다 ( -o에서는 사용하지 못할 수 있음 grep).

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

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

이식성에 관해 말하면 왜 Perl을 사용하지 않습니까?

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

답변3

@slm은 이미 표준 답변을 제공했습니다. 다음은 몇 가지 추가 옵션입니다.

awk및 필드 구분 기호로 사용합니다 '(모든 줄의 형식이 동일하다고 가정).

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

Perl에서 모든 작업을 수행합니다.

$ 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

관련 정보