문제는 *
이 탐욕스러운 연산자이므로 최대한 많이 일치하므로 첫 번째 가능한 일치 항목이 아니라 마지막 가능한 항목과 일치하게됩니다. 따라서 일치 시키려고하는 내용을 변경해야합니다. 문제는 sed
에서 어렵다는 또 다른 "downloadsubtitle.php? id ="를 제외하고는 무엇이든지 일치하도록하려는 것입니다. 당신이 적절한 스크립트를 원하는 경우
sed -nr 's/.*downloadsubtitle.php\?id\=([0-9]+)[^?]*hebrew[^?]*DESPiTE.*/\1/p'
) = 당신이 중 하나는 더 복잡한 나오지도 스크립트를 작성하거나 링크와 제목 사이 ?
의이 없을 것으로 가정 간단한 해결 방법을 사용할 수 있습니다
#!/bin/sed -nf
: next
$! { N; b next }
s/\n//g
s/downloadsubtitle\.php?id=\([0-9][0-9]*\)/\
\1/
: loop
s/^[^\n]*\n//
h
s/\([0-9]*\).*/\1/
x
s/downloadsubtitle\.php?id=\([0-9][0-9]*\)/\
\1/
/^[^\n]*hebrew[^\n]*DESPiTE/ { g; p; q }
/^[0-9]*/ b loop
이 스크립트는 전체 파일을 패턴 공간 (즉 작업 버퍼)으로로드하는 것으로 시작합니다. 이것은 처음 두 줄에서이 작업을 수행합니다. 첫번째 줄은 next
이라는 레이블을 :
"명령"으로 선언합니다. 두 번째 행은 명령으로 패턴 공간에 입력 된 다음 줄을 추가 한 다음 next
레이블로 점프하지만이 두 명령은 아직 마지막 행을 읽지 않은 경우에만 실행됩니다. 세 번째 행은 모든 개행 문자를 제거합니다.
이제는 downloadsubtitle\.php?id=[0-9][0-9]*
의 첫 번째 발생 문자를 줄 바꿈 문자 (백 슬래시 뒤에 실제 줄 바꿈으로 표시)와 ID 번호로 바꿉니다.
새 레이블 loop
이 만들어졌고 첫 번째 줄 바꿈 문자까지 모든 항목을 제거하기 때문에 (ID 앞의 모든 것을 제거합니다).
이제는 번호를 추출하여 보류 공간 (보조 버퍼)에 저장하는 일련의 명령이 있습니다. 먼저 h
명령을 사용하여 전체 패턴 공간을 보류 공간으로 복사 한 다음 숫자 뒤의 모든 것을 제거한 다음 보류 및 패턴 공간의 내용을 x
으로 바꾸십시오. 이제 보류 공간에 숫자가 포함되고 패턴 공간이 해당 값으로 복원되었습니다.
욕심쟁이 검색을 방지하기 위해 다음 출현 downloadsubtitle\.php?id=[0-9][0-9]*
전에 개행 문자를 배치합니다. 개행 문자는 나머지 문자열을 찾았 기 때문에 ID 번호 만 남겨 둘 수 있습니다.
이제 검색 부분이 있습니다. 요약하면, 우리는 실제 ID를 홀드 공간에두고, 패턴 공간의 첫 번째 줄은 텍스트를 검색하고자하는 곳입니다. 그래서 우리는 버퍼 시작 부분부터 문자열 hebrew
과 DESPiTE
을 검색하는 검색 식을 사용합니다.이 검색 식은 서로 또는 새줄로 버퍼의 시작 부분에서 분리되지 않습니다. 따라서 첫 번째 행만 검색했습니다.
일치하는 것이 발견되면 g
을 사용하여 보류 공간에서 ID를 가져오고 p
을 인쇄 한 다음 q
을 종료합니다.
일치하는 항목이 없으면 loop
레이블로 바로 이동하여 다음 발생을 검색합니다. 점프하기 전의 조건은 무한 루프를 방지하기위한 것입니다. 검색 할 내용이 없으면 종료됩니다. 당신 (GNU이 나오지 위해이 작동 할 수
potong - 당신의 솔루션은 매력처럼 작동했습니다!감사 – buntuser