Как удалить пустые строки, начинающие со строки 5

Это является немного историческим.

halt использовался перед ACPI (который сегодня выключит питание для Вас), *. Это остановило бы систему и затем распечатало бы сообщение к эффекту, "нормально выключаться теперь". Тогда были физические выключатели, а не комбинация, ACPI управлял кнопкой питания современных компьютеров.

poweroff, естественно остановит систему и затем отзовет питание ACPI.

* В эти дни halt достаточно умно для автоматического вызова poweroff если ACPI включен. На самом деле они функционально эквивалентны теперь.

10
09.12.2016, 18:35
3 ответа

Если Вы хотите удалить все пустые строки, запускающиеся со строки 5 и сохранить строки 1 - 4, можно использовать

sed -i '5,${;/^$/d;}' temp_spec.rb

{ группирующийся оператор, таким образом, первая команда 5,${ означает "от строки 5 до конца входа ($) выполните следующие команды до соответствия }". Команды между { и } может снова быть снабжен префиксом адресами, таким образом, внутренняя команда /^$/d означает, "если нет ничего между началом (^) и конец ($) из строки удалите его". Команды Sed могут быть разделены ;. (Это - плохо зарегистрированная функция sed. Это поддерживается большинством sed реализаций, но это не совсем портативно.), Как отмечено Hauke, ; после { является дополнительным; тот прежде } требуется, все же.

Если Вы хотите удалить все пустые строки, запускающиеся со строки 5 и также удалить строки 1 - 4, это легче:

sed -i '1,4d;/^$/d' temp_spec.rb
12
27.01.2020, 20:01
  • 1
    Хороший. Я не знал, что адреса могут быть вложены тот путь. Для меня это работает без продвижения;, также. –  Hauke Laging 16.05.2013, 21:58
  • 2
    Да, Вы правы относительно первого ;. большое спасибо –  Uwe 16.05.2013, 22:00
  • 3
    @Hauke, Изолирующая Вас, может разделить команды в sed сценарии''; вместо этого помещая их на отдельные строки. Это - "недокументированная" функция. –  Predrag Punosevac 18.05.2013, 05:17

Другая опция с помощью awk:

awk 'NR<5||/./'
4
27.01.2020, 20:01
sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb

Редактирование 1:

Я, как предполагается, объясняю это, таким образом...

Это излишне сложно. Я не знал, что в диапазонах адресов позволяют {}. Таким образом, я должен был выразить, "удаляют пустые строки" по-другому. Базовая команда t который является способом sed if ... then. T было бы легче, но доступен для GNU sed только. Я цитирую страницу справочника:

t маркировка: Если s///сделал успешную замену, так как последняя входная строка была считана и начиная с последнего t или команды T, то перейдите для маркировки; если маркировка опущена, ответвление к концу сценария.

Я злоупотребляю известным s команда. Это ничего не должно заменять кроме теста только, пуста ли строка. Таким образом, это заменяет пустую строку пустой строкой (мог использовать что-либо в качестве замены, поскольку строка удалена так или иначе).

Если s сделал "замену" затем, строка пуста. В этом случае команда d буду выполняться. Иначе ничто не должно быть сделано. Как t не переходит в случае s действие мне нужна команда ответвления b переходить в конец сценария. : label цели ответвления. Как goto тогда в средневековье (когда sed был изобретен..., хихикают).

Другая опция состояла бы в том, чтобы иметь s "замените" все непустые строки, делая s более сложный, но отдых легче команды:

sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input

^..*$ означает "непустую строку" и \1 означает "содержание первых скобок".

2
27.01.2020, 20:01
  • 1
    Немного объяснения пользы OP (я могу чувствовать, что их мозг пытается выползти через уши, читая это...) –  vonbrand 16.05.2013, 22:21

Теги

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