sed: условное слияние нескольких строк

Мне нужно объединить строку файла с помощью sed на основе шаблона. например:

Входной файл:

X1 A B C D E F

\+ G H I J 1 

\+ LK T PP E OO 2

X2 DDF F Y 

\+ J W Q 

....

Ожидаемый результат:

X1 A B C D E F G H I J 1 LK T PP E OO 2

X2 DDF F Y J W Q 

..

Я хотел бы, чтобы эквивалент wat был возможен в редакторе vi (:%s/\n+//g)

Поискав в Интернете, я нашел решение, которое по логике вещей должно было сработать.

sed -е '{:а; Н; с/\п+/ /г; ta}' профиль

Но эта команда не поддается моему пониманию и логике и выдала вывод

X1 A B C D E F

\+ G H I J 1 LK T PP E OO 2
X2 DDF F Y 

\+ J W Q 

....

Любые идеи приветствуются, и спасибо заранее

Шрисурья


person user1495523    schedule 02.07.2012    source источник


Ответы (3)


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

sed ':a;$!N;s/\n+//;ta;P;D' file

объяснение:

  • :a — заполнитель цикла
  • $!N означает, что если не конец файла, добавьте следующую строку к текущей строке.
  • s/\n+// означает удаление конца строки, за которым следует знак плюс
  • ta означает, что если последняя замена работала, переход к заполнителю цикла a
  • P печатать до первой новой строки.
  • D удалить до первой новой строки включительно.
person potong    schedule 02.07.2012

альтернативный awk oneliner:

awk 'BEGIN{RS="  "}{gsub(/\n\n\+/,"")}1' yourFile
person Kent    schedule 02.07.2012

ответ potong у меня не сработал, но работает что-то подобное:

sed -e :a -e '$!N;s/\n+//;ta' -e 'P;D' file

Хорошая документация по sed здесь: http://sed.sourceforge.net/sedfaq3.html

person Solubris    schedule 22.01.2014