표준화된 PDF 파일에서 추출한 텍스트 파일을 구문 분석하는 쉘 스크립트를 작성 중입니다. 각 테스트 그룹(그룹 0, 그룹 1...으로 식별됨)에 대한 테스트 번호 목록을 얻고 싶습니다(예: 그룹 0의 경우 101, 102, 412...). sed, awk를 시도했지만 이상적으로는 출력을 LaTeX 코드로 변환하고 싶습니다. 즉, 각 출력 항목은 적절한 문자열로 둘러싸여 있습니다.
\section{Group0}
\Testdetails{101}
\Testdetails{102}
...............
\section{Group1}
\Testdetails{305}
................
이것이 소스 파일입니다.
Table 6
Tests EN 2591- Remarks
All models
Group 0
Visual examination 101
Examination of dimensions and mass 102 To be performed on one pair per layout, in
sealed and un-sealed versions
Contact insertion and extraction forces 412 To be performed on one pair per layout, in
sealed and un-sealed versions
Measurement of insulation resistance 206 Only specimens of group 6
Voltage proof test 207 Only specimens of group 6
Contact resistance - Low level 201
Contact resistance at rated current 202
Mating and unmating forces 408 On specimens of groups 2, 4 and 6
Visual examination 101
Group 1
Rapid change of temperature 305
Visual examination 101
Interfacial sealing 324
Measurement of insulation resistance 206 Immersed connectors
Voltage proof test 207 Immersed connectors
Insert retention in housing (axial) 410
Contact retention in insert 409
Mechanical strength of rear accessories 420
Contact retention system effectiveness 426
(removable contact walkout)
Visual examination 101
Group 2
Contact retention in insert 409
Rapid change of temperature 305
답변1
awk '
$1 == "Group" {printf("\\section{%s%d}\n", $1, $2); next}
{for (i=1; i<=NF; i++)
if ($i ~ /^[0-9][0-9][0-9]$/) {
printf("\\Testdetails{%d}\n", $i)
break
}
}
'
의견을 기반으로 업데이트:
awk '
$1 == "Group" {printf("\\section{%s %d}\n", $1, $2); next}
{
title = sep = ""
for (i=1; i<=NF; i++)
if ($i ~ /^[0-9][0-9][0-9]$/) {
printf("\\subsection{%s} \\Testdetails{%d}\n", title, $i)
break
}
else {
title = title sep $i
sep = FS
}
}
'
답변2
perl
사용 regexp
하고 가정하는 한 가지 방법 infile
은 질문에 게시한 내용입니다.
콘텐츠 script.pl
:
use warnings;
use strict;
while ( <> ) {
chomp;
if ( m/\A\s*(Group)\s*(\d+)/ ) {
printf qq[\\Section{%s}\n], $1 . $2;
next;
}
if ( m/\s(\d{3})(?:\s|$)/ ) {
printf qq[\\Testdetails{%s}\n], $1;
}
}
다음과 같이 실행하세요:
perl script.pl infile
다음 출력으로:
\Section{Group0}
\Testdetails{101}
\Testdetails{102}
\Testdetails{412}
\Testdetails{206}
\Testdetails{207}
\Testdetails{201}
\Testdetails{202}
\Testdetails{408}
\Testdetails{101}
\Section{Group1}
\Testdetails{305}
\Testdetails{101}
\Testdetails{324}
\Testdetails{206}
\Testdetails{207}
\Testdetails{410}
\Testdetails{409}
\Testdetails{420}
\Testdetails{426}
\Testdetails{101}
\Section{Group2}
\Testdetails{409}
\Testdetails{305}
답변3
완전성을 위해 sed
버전은 다음과 같습니다.
sed -n -e 's#^ *Group \([0-9]\+\).*#\\Section{Group\1}#p' \
-e 's#.*\b\([0-9][0-9][0-9]\)\b.*#\\Testdetails{\1}#p'