파일의 일부 선택

파일의 일부 선택

다음 형식의 파일이 있습니다.

title1
        line
        line

title2
        line
        line

        line

title3
        line
        line

title2아래 부분을 추출 하여 들여쓰기를 제거하고 싶습니다 . 나는 현재 사용하고 있습니다 sed(그러나 OR 쉘 스크립트는 내 상황에 적합하지만 슬프게도 OR 와 awk같은 언어는 아닙니다 ):perlpython

sed -n -e '/^title2$/,/^[a-zA-Z]/ { /^[a-zA-Z]/ d ; s/^[ \t]*// ; p }'

그러나 이렇게 하면 끝에 논리적으로 빈 줄이 남습니다(논리적으로 공백이나 탭이 있을 수 있기 때문에). 나는 그것을 제거하고 싶다. 섹션에는 보존해야 하는(또는 /^[ \t]*$/ d해당 작업을 수행하는) 다른 논리적으로 빈 줄이 있을 수 있습니다. 그러므로 나는 이 결과를 원한다:

line
line

line

한 번 더 할 수도 sed -e '$d'있는데, 두 번째 과정은 피할 수 있는지 궁금합니다.

답변1

나는 예약된 공간을 사용했고 결국

sed -ne '/^title2$/,/^[a-zA-Z]/ { /^title2$/ { n; h; b; } ; /^[a-zA-Z]/ d; H; x; s/[ \t]*//; P; s/.*\n//; x }'

이것은 내가 관심 있는 사건을 올바르게 처리하는 것 같습니다.

답변2

  • "일반" 줄(탭이나 흰색 없음)인 경우 해당 줄도 삭제하세요./^$/
  • "논리적" 공백 사용의 경우/^\s*$/

    sed -n -e '/^title2:/,/^[a-zA-Z]/ { /^[a-zA-Z]/ d ; /^$/ d ; s/^[ \t]*// ; p }' 
    

어디

  • /^$/매치 스타트 라인, 엔드 라인
  • /^\s*$/시작 줄, 0개 이상의 공백 또는 탭, 줄 끝과 일치합니다.

답변3

sed -n '/title2/,/^\S/ { //b; /^\s*$/ { N; /\n\S/q; P; D }; s/^\s*//; p }'

나는 원래 @Archemar의 관심을 끌기 위해 이렇게 했습니다. 해주시면 정말 감사하겠습니다제발회신하다이 게시물에 대한 내 댓글시간이 있는 한. 대답이 "모른다"라고 하더라도. 감사해요.

적어도 내 bash 쉘에서는 필요하지 않습니다 -e. 왜 필요한지 궁금하십니까? 그리고 만약에\s또는\S[ \t]지원되지 않습니다. 각각 ' 및 [^ \t]' 로 바꿀 수 있습니다 .

이 질문을 처음 봤을 때처럼 아무것도 모르는 사람을 위해:

  • -n자동 인쇄 끄기
  • /title2/,/^\S/검색 범위 sed(문자열이 처음 " title2"으로 나타나는 줄부터 공백이 아닌 문자 [ie title3] 로 시작하는 다음 줄까지)입니다.포함한)
  • {방금 지정한 범위나 패턴에 수반되는 명령을 적용한다는 의미입니다.
    • //b다음 명령은 범위의 시작과 끝 부분에 적용되지 않을 수 있습니다.
      보다 정확하게는 스크립트 끝( )과 일치하거나 분기하면 title2( 남은 줄이 있으면 파일의 다음 줄을 처리합니다)^\Sb암소 비슷한 일종의 영양sed(BSD유사한 설명, 다른 버전이 있는지 확실하지 않음 sed)

      '//' 마지막 정규식 일치를 반복합니다.

    • /^\s*$/범위 내에서 "논리적으로 비어 있는" 행과 일치합니다.
    • {
      • N; /\n\S/q;따라서 "논리적으로 공백" 라인이면 N다음 라인이 패턴 공간에 추가되고, 다음 라인이 다음 헤더이면 처리가 완전히 종료되므로( q) "논리적으로 공백" 라인도 다음 헤더도 아닙니다. 인쇄됩니다.
      • P; D"논리적으로 비어 있는" 줄인 경우아니요다음은 다음 제목이고 그 다음은오직"논리적으로 빈" 줄( P)을 인쇄한 다음오직패턴 공간에서 "논리적으로 빈" 줄을 제거하고 N스크립트 시작 부분부터 처리할 패턴 공간에 다음 줄을 추가한 채로 둡니다( D).
    • }
    • s/^\s*//; p줄 시작 부분에서 공백과 탭을 제거하고 서식이 지정된 줄을 인쇄합니다.
  • }

@Archemar 부탁드려요돕다

관련 정보