작업할 데이터(some-mutool-clean-pdf-file)는 다음과 같습니다. 비록 앞의 숫자가 데이터의 일부는 아니지만 제 질문을 명확히 하는 데 도움이 되기를 바랍니다.
1 blabla
2 /Span <</MCID
3 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
4 .(s).(o)..(m).(e)...(c).(h)...(a)..(r)..
5 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
6 EMC
7 blabla
8 blabla
9 blabla
10 /H1 <</MCID
11 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
12 .(s).(o)..(m).(e)...(c).(h)...(a)..(r)..
13 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
14 EMC
15 blabla
점은 \d
"또는" [
또는 " ]
또는" TJ
등을 나타내므로 인쇄하지 않는 것이 좋습니다.
원하는 결과:
3 somechar
4 somechar
5 somechar
11 somechar
12 somechar
13 somechar
다음 명령은 "다중 부팅 모드"가 없다는 점을 제외하고 내가 달성하려는 작업을 대략적으로 수행합니다. 더 나은/다른 방법이 있을 것이라고 확신하지만 이것이 함께 편집할 수 있는 방법입니다.
sed -n '/\/H1\ <<\/MCID/,/EMC/{=;p}' somepdffile | sed '{N;s/\n/ /}' | sed -n 's/\[\(.*\)\]/...\1.../p' | sed 's/(\|)\|\.\|TJ\|-//g' | sed -r
> 's/(^[0-9]*)*[0-9]*/\1/g'
이것이 작동한다고 상상하는 방법은 다음과 같습니다. 불행하게도 그렇지는 않지만, 내가 달성하려는 것이 무엇인지 보여주기를 바랍니다("다중 시작 패턴" 및 "종료 일치" - 이름이 올바르게 지정되었으면 좋겠습니다).
여기서 "다중 시작 패턴"은 명시적으로 다음을 의미합니다. /H1 <<MCID
또는 /Span <<MCID
, 둘 다 로 끝납니다 EMC
. : 과 일치하는 방법은 없지만 또는 와 다른 태그가 /any_tag <<MCID
있습니다 . 괄호 사이의 문자는 항상 패턴이 있는 모든 범위에서 인쇄되어야 하지만, 다른 태그로 시작하는 범위에서도 인쇄되어서는 안 됩니다.H1
Span
(letter)
sed -n '/\/H1\ <<\/MCID\|\/Span\ <<\/MCID/,/EMC/{=;p}' somepdffile | sed '{N;s/\n/ /}' | sed -n 's/\[\(.*\)\]/...\1.../p' | sed 's/(\|)\|\.\|TJ\|-//g' | sed -r 's/(^[0-9]*)*[0-9]*/\1/g'
어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다!
답변1
여기에 해결책이 있습니다 awk
. 이 기능을 구현하려면 GNU awk가 필요합니다 gensub()
.
awk '$0=="EMC" {s=0} s{print FNR, gensub(/[^(]*\((.)\)[^(]*/, "\\1", "g")} /^\/(Span|H1) <<\/MCID$/ {s=1}' test.pdf
s
/Span
이는 OR로 시작 /H1
하고 이어서 OR로 끝나는 행 으로 정의된 시작 패턴이 발견되면 플래그를 1로 설정합니다 <</MCID
. EMC
다음을 포함하는 행이 발견 되면 이 플래그가 재설정됩니다.
이 범위(즉, s
1인 경우) 내에서 이 함수를 사용하여 "a가 아닌 문자의 개수 에 관계없이 , 그 뒤에 a가 아닌 문자가 뒤따름 " gensub()
패턴을 다음 에 포함된 문자 로 바꿉니다. . 그런 다음 현재 줄 번호와 추출된 텍스트를 인쇄합니다.(
( )
(
( )
노트이는 다음이 있음을 의미합니다.아니요시작선과 끝선 사이에는 이 패턴의 선이 없습니다.