다음 형식의 파일이 있다고 가정해 보겠습니다.
(lots of sections...)
SECTION foo
keyA=valA
...
ENDSECTION
(lots of sections...)
sed를 사용하여 해당 부분을 추출할 수 있습니다 sed -nE /^SECTION foo$/,/^ENDSECTION$/p
. 내 문제는 형식이 다음과 같이 변경될 때 발생합니다.
(lots of sections...)
SECTION
keyA=valA
id=foo
...
ENDSECTION
(lots of sections...)
일반적인 도구(grep, sed, awk, perl, bash)를 사용하여 이 부분을 얻을 수 있는 방법이 있습니까?
답변1
이는 문서의 형식이 얼마나 "잘 구성되어 있는지"에 따라 다소 달라집니다. 각각 SECTION
에 대해 일치하는 항목이 있다고 확신한다면 ENDSECTION
아래 코드가 awk
작동할 것입니다. 단, "한 줄짜리"라고 부르지는 않겠습니다(처음부터 이것이 가능한지 확신할 수 없습니다).
awk -v pat='id=foo' '/^SECTION/{n=f=0; delete buf;} \
{buf[++n]=$0; if (index($0,pat)) f=1} \
/^ENDSECTION/ {if (f) for (i=1;i<=n;i++) print buf[i]}' input.txt
- 검색 패턴은 사용자가 지정하는 대로 적용됩니다
pat
(그러나 현재 형식에서는 정규식 기반 검색이 아닌 고정 문자열 검색만 수행합니다). SECTION
(또는 키워드)로 시작하는 줄이 발견되면 플래그f
("발견"을 의미)와 줄 카운터가n
0으로 초기화됩니다. 또한 섹션이 완료될 때까지 인쇄 여부를 결정할 수 없기 때문에 섹션 전체를 버퍼링해야 하므로 버퍼 변수를 지웁니다buf
.- 모든 행(이 예에서는 빈 행 포함)에 대해 행 카운터가
n
증가하고 해당 행이 배열 변수에 추가됩니다buf
. 이 플래그는 라인에서 패턴이 발견되면f
설정됩니다1
. ENDSECTION
키워드가 줄의 시작 부분에 있고 플래그가 이면f
버퍼1
를 한 줄씩 인쇄하여 해당 부분을 출력합니다.
모든 부분이 빈 줄로 구분되어 있는지 확인할 수 있다면,이 답변적은 코드로 이 작업을 수행하는 방법에 대한 올바른 방향을 알려줄 수 있지만 이것이 보장되지 않으면 "단락 모드" 접근 방식이 awk
작동하지 않습니다.
또한 이 제안은 작업을 수행하는 데 필요한 최소한의 사항입니다. 빈 줄을 건너뛰거나 다른 온전성 검사 요구 사항을 충족하려는 경우 코드가 상당히 길어질 수 있습니다.