(?<=\[')[^,]*
다음 줄이 포함된 파일에서 이 정규식을 사용하고 있습니다 .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
여기서 이스케이프 처리된 백슬래시의 "이상한" 사용에 주목하세요. 이는 sed
BRE가 기본적으로 사용되기 때문입니다(참조:이 문제).
이식성에 관해 말하면 왜 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