파일에서 여러 줄 삭제

파일에서 여러 줄 삭제

일반적으로 이전에 답변한 질문에서 답변을 찾지만 이번에는 그렇지 않습니다(또는 답변을 이해하지 못하고 원하는 대로 수정할 수 없음). 그래서 첫 번째 질문을 하게 됩니다. 여기.

내 입력 파일은 다음과 같습니다

# -*- coding: utf-8 -*-

[attachment]

[browser]


[changeset]

[components]
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = enabled 
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled

[header_logo]

[inherit]
file = /etc/trac/trac.ini

[logging]

첨부 파일, 브라우저, 변경 집합, header_logo 및 로깅과 같은 빈 섹션을 모두 제거하고 싶습니다. 비어있지 않은 부분만 남겨두겠습니다. 출력 파일은 다음과 같습니다.

# -*- coding: utf-8 -*-

[components]
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled

[inherit]
file = /etc/trac/trac.ini

이는 bash 스크립트에서 발생해야 합니다. sed:find regex 사용에 대해 생각했지만 \[.+\]\n(\n)+(?=\[)정규식이 몇 줄이 될지 미리 알고 그에 N따라 사용해야 하기 때문에 sed에서는 작동하지 않는 것 같습니다. 정규식은 Final 대신 EOF에서도 작동해야 \[하지만 \[.

어떻게 할 수 있는지 아시나요? sed보다 더 좋은 방법이 있습니까?

답변1

약간 혼란스럽기는 sed하지만 가능합니다.

sed -n '
:start
/^\[/{
    h
  :loop
    n
    /^\[/b start
    /^$/b loop
    x;p;g
}
p'

-n기본적으로 아무것도 인쇄되지 않음을 나타냅니다. :start나중에 goto를 위한 레이블입니다. 줄의 시작 부분을 일치시키고 [일련의 ({...}) 명령을 실행합니다. 행을 예약된 공간(h)에 복사합니다. 다음 행(n)을 얻습니다. 시작하면 [빈 섹션이 있으므로 (b)로 이동하여 다시 시작하세요.

줄이 비어 있으면(/^$/) 다른 줄을 읽습니다(goto 루프). 줄은 비어 있지 않으므로 유지된 섹션 헤더(x)로 줄을 바꾸고, 섹션 헤더(p)를 인쇄하고, 현재 줄(g)을 가져오고, 명령 그룹에서 줄을 계속 인쇄(p)합니다. 마지막(p)도 섹션이 아닌 헤더를 인쇄합니다.

답변2

나는 다음 awk와 함께 왔습니다

BEGIN { empty=0 ; section = "" ; }
substr($0,1,1) == "[" { section = $0 ; next ; }
NF == 0 { if ( empty++ ) print ; section = "" ; next ; }
NF > 0  { if ( section != "" ) print section ; print ; section = "" ; }

으로 호출됩니다

awk -f pgm.awk infile > outfile

그러나 Terdon이 언급했듯이 라이브러리를 사용하는 것이 더 낫습니다. 이 파일 형식은 그렇게 비밀이 아니며 라이브러리가 cr, cr/nlnl줄 끝을 처리합니다.

관련 정보