sed는 범위 내의 행을 삭제합니다.

sed는 범위 내의 행을 삭제합니다.

XML 파일이 있습니다. 행 범위에서 빈 행만 제거하려고 합니다. 이 예에서는 55-57행을 확인하고 빈 행을 모두 제거하고 싶습니다.

이는 모두 xml인 여러 파일을 통해 쉘 스크립트에서 수행되어야 합니다. 이것은 RHEL 7 시스템입니다.

를 사용해 보았 sed으나 빈 줄을 제거할 수 없었습니다.

적절한 줄 번호를 얻기 위해 명령문을 작성했으며 이는 쉘 스크립트에 vars( start_line, finish_line) 로 저장되었습니다.

예시 파일:

1.
2. 
3. <Test></Test>
        .
        .
        .
55.
56.
57.<!-- keep the comment -->
58. <KeepTag></KeepTag>

55-57 범위의 빈 줄만 삭제하는 방법은 무엇입니까?

답변1

당신은 이것을 쉽게 할 수 있습니다:

awk 'FNR>=55 && FNR<=57 && NF==0{next}1' file

awk이는 "기본 프로그램 본문"(즉, 외부 규칙별 코드 입력)의 a가 "규칙에 의해 수행된 모든 수정 사항을 포함하여 현재 줄을 인쇄한다"는 의미 라는 일반적인 약칭 표기법을 사용합니다 .1{ ... }

그러나 print다음 명령을 실행하여 next이를 우회합니다 .만약에다음 표준이 적용됩니다.

  • 줄 번호는 55에서 57 사이입니다(조건: FNR>=55 && FNR<=57FNR파일별 줄 번호입니다. 반면에 NR글로벌 줄 번호는 awk단일 호출에서 여러 파일을 처리하는 데 사용할 경우 변경될 수 있습니다. 다릅니다! )

    그리고

  • 행에는 으로 표시되는 텍스트가 없으며 NF콘텐츠 필드 수가 0입니다.

이 "우회"로 인해 awk생성된 출력은 지정된 줄 범위 내에 있는 경우 빈 줄을 제외합니다.

답변2

sed를 사용하면 주소 범위를 사용하여 이 작업을 수행할 수 있습니다.

sed '55,57{/^$/d}' file

그러면 55행과 57행(55,57) 사이에 선택된 빈 행(/^$/)에 d 명령(삭제)이 적용됩니다. 테스트할 수는 없지만 macOS에서는 d 명령 뒤에 ";"를 추가해야 할 것 같습니다.

사용

sed -i '55,57{/^$/d;}' file

파일을 로컬에서 수정하려는 경우

답변3

그리고 sed:

start_line=55
finish_line=57
sed "$start_line","$finish_line"'{/^$/d;}' file

관련 정보