태그 사이에서 문자열을 추출하여 새 텍스트 파일에 저장

태그 사이에서 문자열을 추출하여 새 텍스트 파일에 저장

파일에서 텍스트 문자열을 추출하여 새 파일에 넣어야 합니다. 각 문자열은 항상 동일한 텍스트(레이블) 사이에 있습니다.

다음은 예입니다(이와 같은 수백 개의 블록이 있으며 해당 블록의 데이터를 파일에 저장해야 합니다).

1731 0 obj
<</Page 250/Type/Annot/Subtype/Highlight/Rotate 0/Rect[ 95.4715 347.644 337.068 362.041]/NM(929cd95c-f962-4fa3-b734-2e0e67d7b321)/T(iPad)/CreationDate(D:20160818145053Z00'00')/M(D:20160818145204Z00'00')/C[ 0.454902 0.501961 0.988235]/CA 1/QuadPoints[ 95.4715 362.041 337.068 362.041 95.4715 347.644 337.068 347.644]/Contents(EXAMPLE OF TEXT TO BE EXTRACTED)/F 4/Subj(Highlight)>>
endobj

추출해야해요250페이지그리고추출할 텍스트의 예

~을 위한250페이지예를 들어 관련 태그는 다음과 같습니다.

<</

그리고

/Type

~을 위한추출할 텍스트의 예예를 들어 관련 태그는 다음과 같습니다.

/Contents(

그리고

)/F

궁극적으로 페이지와 해당 텍스트를 오름차순으로 정렬하고 싶지만 이를 스프레드시트에서 관리할 수 있습니다.

답변 중 일부를 사용해 보았습니다.여기, 하지만 작동시킬 수 없었습니다...

저는 Unix 명령줄에 가장 익숙하지만 Python과 AppleScript에 대해서는 약간 알고 있습니다.

답변1

그리고 awk:

awk -F/ '$1=="<<" {i=$2; for(j=3;j<=NF;j++) \
         if($j~/^Contents/) split($j,a,"[()]"); print i " _ " a[2]}' file.txt
  • 필드 구분 기호를 로 설정하고 /첫 번째 필드가 인 경우 나중에 인쇄할 <<수 있도록 두 번째 필드를 변수로 저장합니다.i

  • 나머지 필드를 반복하고 필드가 로 시작하는 경우 Contents필드를 분할하여 ()배열을 만듭니다 a.for(j=3;j<=NF;j++) if($j~/^Contents/) split($j,a,"[()]")

  • 변수 i와 배열의 두 번째 요소를 a분리하여 인쇄합니다._

예:

% cat file.txt                                                                                                        
1731 0 obj
<</Page 250/Type/Annot/Subtype/Highlight/Rotate 0/Rect[ 95.4715 347.644 337.068 362.041]/NM(929cd95c-f962-4fa3-b734-2e0e67d7b321)/T(iPad)/CreationDate(D:20160818145053Z00'00')/M(D:20160818145204Z00'00')/C[ 0.454902 0.501961 0.988235]/CA 1/QuadPoints[ 95.4715 362.041 337.068 362.041 95.4715 347.644 337.068 347.644]/Contents(EXAMPLE OF TEXT TO BE EXTRACTED)/F 4/Subj(Highlight)>>
endobj

% awk -F/ '$1=="<<" {i=$2; for(j=3;j<=NF;j++) if($j~/^Contents/) split($j,a,"[()]"); print i " _ " a[2]}' file.txt
Page 250 _ EXAMPLE OF TEXT TO BE EXTRACTED

답변2

샘플 콘텐츠를 다음에 추가했습니다.디스크 파일명명 된문서그런 다음 콘텐츠를 표시합니다.문서사용cat 주문하다. 그런 다음 awkon을 사용하여 file기본적으로 전화하는 부분을 제거했습니다.상표그리고 두 장을 인쇄해 보세요데이터안에탭으로 구분됨체재. 이것이 당신이 찾고 있는 것입니까?

$ cat file
1731 0 obj
<</Page 250/Type/Annot/Subtype/Highlight/Rotate 0/Rect[ 95.4715 347.644 337.068 362.041]/NM(929cd95c-f962-4fa3-b734-2e0e67d7b321)/T(iPad)/CreationDate(D:20160818145053Z00'00')/M(D:20160818145204Z00'00')/C[ 0.454902 0.501961 0.988235]/CA 1/QuadPoints[ 95.4715 362.041 337.068 362.041 95.4715 347.644 337.068 347.644]/Contents(EXAMPLE OF TEXT TO BE EXTRACTED)/F 4/Subj(Highlight)>>
endobj
$ awk '{sub(/\<\<\//, "")};{sub(/\/Type.*\/Contents\(/, "\t")};{sub(/\)\/F.*$/, "")};/Page [0-9]/{print}' file
Page 250    EXAMPLE OF TEXT TO BE EXTRACTED
$

무엇인가요awk 프로그램하고있다:

  • /Page [0-9]/공백(예: "페이지")과 숫자(예:)가 포함된 행을 검색합니다 Page 250. EXAMPLE OF TEXT TO BE EXTRACTED패턴이 포함되지 않을 것이라고 가정합니다 . 그래도 상관없다고 생각해요암호이를 수용하도록 쉽게 수정할 수 있습니다.

  • sub(/\<\<\//, "")줄자:<</

  • sub(/\/Type.*\/Contents\(/, "\t")/Type사이의 모든 것을 탭으로 대체합니다./Contents(
  • sub(/\)\/F.*$/, ""))/F해당 줄부터 끝까지 모든 것을 제거합니다 .

이제 남은 것은 인쇄되는 것뿐입니다. 수배 아이템 2개데이터탭 문자로 구분하세요.

나는 이것이 당신이 언급한 모든 것을 다루지는 않는다는 것을 알고 있지만 다른 요구 사항은 충분히 명확하지 않습니다. 하나의 파일만 처리해야 합니까, 아니면 여러 파일을 처리해야 합니까? 두 경우 모두 추출된 모든 데이터를 하나의 파일에 넣기를 원하시나요? 그리고 데이터 정렬 방법 등을 선택하세요.

그래서 당신이 몇 가지 사항을 명확히 할 수 있다면 나는 하나를 쓸 것입니다배쉬 스크립트가려.

분명히awk 프로그램출력을 다음으로 리디렉션할 수 있도록 제공했습니다.결과물 파일그리고 계속 노력해sort 주문하다. 정렬도 가능하지만 이 시점에서는 awk하나의 명령줄에서 대상 데이터를 가져올 수 있습니다.awk

관련 정보