특정 줄을 추출해야 하는 유사하지만 약간 다른 구조를 가진 일반 텍스트 파일이 많이 있습니다.
이 텍스트 줄은 특정 패턴을 따르지 않으며(즉, 내용이 항상 다름) 파일의 동일한 위치에 항상 위치하는 것은 아닙니다. 일반적으로 파일 시작 부분 근처에 있습니다.
파일은 보도 자료(원래는 PDF로, 즉석에서 텍스트로 변환 사용 pdftotext
)이고 추출해야 하는 줄은 나중에 파일 이름으로 사용해야 하는 주제입니다.
이 파일을 실행하여 sed -n '1p'
첫 번째 줄을 추출하면 때로는 원하는 결과를 얻을 수 있지만 그렇지 못한 경우가 더 많습니다.
내가 얻은 다양한 결과의 예:
Title of the press release # correct result
# wrong, here the first line is empty
29.9.2016 # wrong, here the first line contains the date
PRESS RELEASE # also wrong, I would need to scan further down
거의 모든 경우입니다. 저를 희망적으로 만드는 것은 파일의 구조가 매우 유사하고 시작 부분에 헤더가 포함되어 있기 때문에 계속해서 스캔하면 조만간 원하는 것을 찾을 수 있다는 것입니다.
sed에게 알릴 수 있는 방법이 있나요?동일한 sed 명령에서, 일련의 조건이 충족될 때까지 다양한 패턴을 시도해 보세요.아니요만났나요?
내 경우에는 sed에게 다음과 같이 말해야 합니다.
- 행이 비어 있는지 확인
- 행에 날짜가 포함되어 있지 않은지 확인하십시오.
- 줄에 "보도자료"라는 단어가 포함되어 있지 않은지 확인하세요.
조건 중 어느 것도 충족되지 않으면 해당 라인이 출력됩니다. 충족되면 다음 라인으로 점프합니다.
이것이 sed가 할 수 있는 일인가요?
답변1
PRESS RELEASE
비어 있지 않고(공백만 포함하지 않고) 숫자와 점만 포함하지 않고 문자열 (대문자)도 포함하지 않는 모든 형식의 텍스트에서 첫 번째 줄을 찾습니다.
sed '/^[[:blank:]]*$/d; /^[0-9.]*$/d; /PRESS RELEASE/d; q' file
날짜 -
에 공백이 포함될 수 있고 if가 , 또는 ( 또는 다른 조합) PRESS RELEASE
으로 작성될 수도 있는 경우:press release
Press Release
Press release
pRESS Release
sed -E '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /[Pp](RESS|ress) [Rr](ELEASE|elease)/d; q' file
또는 sed
대소문자를 구분하지 않는 일치를 위해 GNU를 사용하십시오 press release
.
sed '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /press release/Id; q' file
패턴이 트리거될 때마다 d
명령은 입력에서 해당 라인을 제거하고 다음 라인으로 새 루프를 시작합니다. 모드가 트리거되지 않으면 q
스크립트가 종료되지만 현재 줄이 먼저 인쇄됩니다.