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

여기서 이스케이프 처리된 백슬래시의 "이상한" 사용에 주목하세요. 이는 sedBRE가 기본적으로 사용되기 때문입니다(참조:이 문제).

이식성에 관해 말하면 왜 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

관련 정보