2012-04-03 4 views
13

У меня есть файл, который изредка разделяет линии. Разделение сигнализируется тем фактом, что линия начинается с «+» (возможно, предшествуют пробелам).sed: соединительные линии в зависимости от второго

line 1 
line 2 
    + continue 2 
line 3 
... 

Я хотел бы присоединиться к раздвоение линии назад:

line 1 
line 2 continue 2 
line 3 
... 

с использованием СЭД. Я не понимаю, как присоединиться к линии с , предшествующей.

Любое предложение?

ответ

15

Это может работать для вас:

sed '$!N;s/\n\s*+//;P;D' file 
+1

Ничего, это даже работает в не-GNU sed, если вы замените '\ s' пробелом! +1. – ghoti

+0

@ghoti Я верю, что '[[: blank:]] *' может работать лучше? –

+1

@AquariusPower, да, это будет соответствовать пробелам, но оно также будет соответствовать вкладкам, что, конечно же, также соответствует решению '\ s' Potong. ОП заявил, что продолжение обозначается символом «+», которому предшествуют пробелы *, но он ничего не сказал о вкладках. Наверное, не имеет значения, но вы никогда не знаете. – ghoti

2

Я не являюсь частью sed, поэтому для меня это был хороший вызов.

sed -n '1{h;n};/^ *+ */{s// /;H;n};{x;s/\n//g;p};${x;p}' 

В AWK это примерно:

awk ' 
    NR == 1 {hold = $0; next} 
    /^ *\+/ {$1 = ""; hold=hold $0; next} 
    {print hold; hold = $0} 
    END {if (hold) print hold} 
' 

Если последняя строка является строка «+», то СЭД версия будет печатать завершающую пустую строку. Не удалось выяснить, как его подавить.

+0

Обратите внимание, что это GNU-SED-только. Конечно, awk-версия является более понятной для чтения, но она также страдает, потому что, когда вы '$ 1 =" ";', вы указываете awk переписать $ 0 с его по умолчанию OFS. Это может быть неважно, но его следует помнить, если кто-то захочет использовать это решение. – ghoti

1

Делать это в СЭД, безусловно, является хорошим упражнением, но это довольно тривиально в Perl:

perl -0777 -pe 's/\n\s*\+//g' input 
2

Вы можете использовать Vim в режиме Ex:

ex -sc g/+/-j -cx file 
  1. g глобальный поиск

  2. - выберите предыдущую строку

  3. j присоединиться к следующей строке

  4. x сохранить и закрыть

Смежные вопросы