У меня есть файл 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>
What можно ли сделать так, чтобы пустые строки удалялись только из диапазона 55-57?
Это можно легко сделать с помощью awk:
awk 'FNR>=55 && FNR<=57 && NF==0{next}1' file
Здесь используется обычная awk
сокращенная запись, согласно которой 1
в «основном теле программы» (, т. е. вне кода, специфичного для правила -в {... }
), означает «печатать текущую строку, включая любые модификации, выполненные правила".
Однако он обходит эту команду print
, выдавая команду next
, если применяются следующие критерии:
Номер строки находится между (и включает )55 и 57 (условие :FNR>=55 && FNR<=57
, где FNR
является номером --для -строки файла -в отличие от NR
, глобальный номер строки, который может отличаться, если вы используете awk
для обработки нескольких файлов за один вызов!)
и
строка не содержит текста, обозначенного NF
, количество полей содержимого равно нулю.
Из-за этого «обхода» выходные данные, сгенерированные awk
, будут исключать пустые строки, если они попадают в указанный диапазон строк.
Сsed
:
start_line=55
finish_line=57
sed "$start_line","$finish_line"'{/^$/d;}' file
С помощью sed вы можете сделать это с диапазоном адресов
sed '55,57{/^$/d}' file
это применит команду d (удалить )к выбранной пустой строке (/^$/ )между строками 55 и 57 (55,57 ). Я не могу проверить это, но я думаю, что вы должны добавить ';' после команды d в macos.
использовать
sed -i '55,57{/^$/d;}' file
если вы хотите изменить файл локально