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" 대신 "버전: 1.2.3"이 표시됩니다.

내가 뭘 잘못했나요?

답변1

grep사용Posix 기본 정규식( BRE) 귀하의 표기법은 기본적으로 지원되지 않습니다.

가능한 경우 grep -EPosix 확장 정규식( ERE) 및 grep -PPerl 호환 정규식( )을 사용 하는 데 사용됩니다 .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아무 작업도 수행하지 않으므로 여기서는 필요하지 않습니다.


버전 번호만 알고 싶다면,사용\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

관련 정보