string1과 string2 사이의 콘텐츠를 찾거나 파악하는 방법은 무엇입니까?

string1과 string2 사이의 콘텐츠를 찾거나 파악하는 방법은 무엇입니까?

시간이 지남에 따라 변경될 수 있는 긴 문자열에서 값을 추출하려고 합니다. 예를 들어 문자열은 다음과 같습니다.

....../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-Ped

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사용하여 이 작업을 수행할 수 있습니다 .sedawk

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;
}'

관련 정보