시간이 지남에 따라 변경될 수 있는 긴 문자열에서 값을 추출하려고 합니다. 예를 들어 문자열은 다음과 같습니다.
....../filename-1.9.0.3.tar.gz"<....
내가 추출하고 싶은 것은 사이의 값입니다파일 이름-그리고.tar.gz, 기본적으로 파일 버전(이 경우 1.9.0.3)입니다. 이렇게 해야 하는 이유는 나중에 명령을 실행할 수 있고 값이 1.9.0.6 또는 2.0.0.2이거나 완전히 다른 값이 될 수 있기 때문입니다.
어떻게 해야 하나요? 현재는 grep만 사용하고 있지만 sed, awk, cut 등과 같은 다른 유틸리티를 사용해도 괜찮습니다. 완전히 명확하게 하려면 문자열의 파일 버전 부분만 추출하면 됩니다. 꽤 길기 때문에(양쪽 모두) 다른 모든 부분은 어떻게든 제거해야 합니다.
답변1
grep -P
/ 의 경우 pcregrep
긍정적인 뒤돌아보기와 긍정적인 예측을 사용합니다.
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
귀하의 경우 다음 STRING1
으로 교체하십시오.filename-
STRING2
\.tar\.gz
액세스 권한이 없거나 지원이 없는 pcregrep
경우 즐겨 사용하는 텍스트 처리 도구를 사용하여 이 작업을 수행할 수 있습니다. 다음은 동일한 출력을 제공하는 이식 가능한 방법입니다 .grep
-P
ed
ed -s infile <<\IN
g/STRING1/s//\
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
작동 방식: 각 항목에 개행 문자를 추가한 다음 STRING1
(이제 각 줄은 최대 한 번 발생함) STRING1.*STRING2
나머지는 일치하지 않는 줄을 모두 삭제하고 STRING1
와 사이에 있는 내용을 유지하고 STRING2
결과를 인쇄합니다.
답변2
POSIX 시스템이 없는 사람들을 위해 또는 POSIX 시스템을 grep -P
사용하여 이 작업을 수행할 수 있습니다 .sed
awk
sed -n -e 's/^.*\/filename-\([^\/]*\)\.tar\.gz.*$/\1/p' -e T -e q
설명: 기본 인쇄를 끄고 원하는 패턴이 포함된 줄을 찾아 유지하려는 부분을 제외한 모든 부분을 교체하고 교체 결과를 인쇄하고 일치하는 경우 종료합니다. 첫 번째 일치 라인에 일치하는 항목이 여러 개 있는 경우 마지막 일치 항목이 선택됩니다.
awk 사용(라인의 첫 번째 항목 선택):
awk 'match($0, /filename-[^/]*\.tar\.gz/) {
print substr(RSTART + 9, RSTART + RLENGTH - 9 - 6, $0);
exit;
}'