sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Редагувати 1:
Я повинен пояснити це, таким чином ...
Це зайво складно. Я не знав, що діапазони адрес дозволені в межах {}. Тому мені довелося виражати "видалити порожні рядки" по-різному. Основна команда полягає в тому, tяким є sed-шлях if ... then. Tбуло б простіше, але він доступний лише для GNU sed. Я цитую сторінку man:
t label: Якщо як /// здійснив успішну заміну з моменту зчитування останнього рядка вводу та з останньої команди t або T, то гілка на мітку; якщо мітка пропущена, відгалуження до кінця скрипту.
Я зловживаю відомою sкомандою. Він не замінить нічого, а лише перевірить, чи рядок порожній. Таким чином, він замінює порожній рядок порожнім рядком (може використовувати що-небудь як заміну, оскільки рядок все одно видаляється).
Якщо sви зробили "заміну", рядок порожній. У цьому випадку команда dвиконується. Інакше нічого не робити. Як tне скаче у випадку sдії, мені потрібна команда гілки, bщоб перейти до кінця сценарію. : labelє галузевими цілями. Як і gotoтоді, у темні віки (коли був винайдений sed ... хе-хе).
Іншим варіантом було б s«замінити» всі непусті рядки, що спростить sскладніші, але решта команди простіші:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$означає "не порожній рядок" і \1означає "вміст перших дужок".