sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Изменить 1:
Я должен объяснить это, таким образом ...
Это излишне сложно. Я не знал, что диапазоны адресов разрешены в пределах {}. Поэтому мне пришлось выразить «удалить пустые строки» по-другому. Основная команда - tэто способ sed if ... then. Tбыло бы проще, но доступно только для GNU sed. Я цитирую справочную страницу:
метка t: если as /// выполнила успешную замену после прочтения последней строки ввода и после последней команды t или T, то переход к метке; если метка опущена, переход к концу скрипта.
Я злоупотребляю знаменитой sкомандой. Он не должен ничего заменять, а только проверяет, пуста ли строка. Таким образом, он заменяет пустую строку пустой строкой (в качестве замены может использоваться что угодно, поскольку строка в любом случае удаляется).
Если sпроизведена «замена», то строка пуста. В этом случае команда dдолжна быть выполнена. Иначе ничего не поделаешь. Как tне прыгает в случае sдействия мне нужна команда bперехода, чтобы перейти к концу скрипта. : labelявляются целями филиала. Как gotoтогда, в темные века (когда был изобретен sed ... te-hee).
Другой вариант - s«заменить» все непустые строки, sупрощая более сложную, но остальную часть команды:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$означает «непустая строка» и \1означает «содержимое первых скобок».