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>

What можно ли сделать так, чтобы пустые строки удалялись только из диапазона 55-57?

1
17.06.2020, 18:03
3 ответа

Это можно легко сделать с помощью :

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, будут исключать пустые строки, если они попадают в указанный диапазон строк.

2
18.03.2021, 23:26

Сsed:

start_line=55
finish_line=57
sed "$start_line","$finish_line"'{/^$/d;}' file
1
18.03.2021, 23:26

С помощью sed вы можете сделать это с диапазоном адресов

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

это применит команду d (удалить )к выбранной пустой строке (/^$/ )между строками 55 и 57 (55,57 ). Я не могу проверить это, но я думаю, что вы должны добавить ';' после команды d в macos.

использовать

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

если вы хотите изменить файл локально

1
18.03.2021, 23:26

Теги

Похожие вопросы