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<=57
은FNR
파일별 줄 번호입니다. 반면에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