Это является немного историческим.
halt
использовался перед ACPI (который сегодня выключит питание для Вас), *. Это остановило бы систему и затем распечатало бы сообщение к эффекту, "нормально выключаться теперь". Тогда были физические выключатели, а не комбинация, ACPI управлял кнопкой питания современных компьютеров.
poweroff
, естественно остановит систему и затем отзовет питание ACPI.
* В эти дни halt
достаточно умно для автоматического вызова poweroff
если ACPI включен. На самом деле они функционально эквивалентны теперь.
Если Вы хотите удалить все пустые строки, запускающиеся со строки 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
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
означает "содержание первых скобок".
;
, также. – Hauke Laging 16.05.2013, 21:58;
. большое спасибо – Uwe 16.05.2013, 22:00