grep을 사용하여 정규식을 기반으로 파일에서 일부 텍스트를 추출합니다.

grep을 사용하여 정규식을 기반으로 파일에서 일부 텍스트를 추출합니다.

나는 이 파일을 가지고 있습니다 :

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( )를 사용하는 데 사용합니다 .EREgrep -PPCRE

귀하의 표기법은 다음과 같이 작동합니다 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

관련 정보