(?<=\[')[^,]*
다음 줄이 포함된 파일에서 이 정규식을 사용하고 있습니다.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