나는 이 파일을 가지고 있습니다 :
header:
title: hello
version: 1.2.3
버전 번호를 추출하고 싶습니다.
내 원래 시도는
grep ^\s+version:\s+(\d\.\d\.\d) file.txt
하지만 그 결과 빈 출력이 생성되었습니다. 댓글에 제안을 한 후 시도해 보았습니다.
grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
하지만 "1.2.3" 대신 "version: 1.2.3"이 표시됩니다.
내가 도대체 뭘 잘못하고있는 겁니까?
답변1
grep
용도Posix 기본 정규식( BRE
)는 기본적으로 귀하의 표기법을 지원하지 않습니다.
Posix Extended Regex( ) grep -E
를 사용 하고 가능한 경우 Perl Compatible Regex( )를 사용하는 데 사용합니다 .ERE
grep -P
PCRE
귀하의 표기법은 다음과 같이 작동합니다 grep -P
.
grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
이는 다음과 함께 작동합니다 BRE
.
grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt
산출:
version: 1.2.3
캡처 그룹은 grep
아무 작업도 수행하지 않으므로 여기서는 필요하지 않습니다.
버전 nr만 원하는 경우,사용\K
그리고 -o
옵션:
grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt
산출:
1.2.3
에서는 BRE
이것이 불가능합니다. 두 가지 명령을 연결해야 합니다 grep
.
grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'
또는 다음을 사용하십시오 sed
(크레딧 @Kusalananda):
sed -n 's/.*version: //p' file.txt
답변2
님의 의견에 따르면플루모그리고grep을 사용하여 이름 바로 뒤에 무엇이든 얻는 방법작업 명령은 다음과 같습니다.
grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt