2015-07-24 3 views
0

У меня есть tsv.-файл, и есть несколько строк, которые не заканчиваются символом '' '. Так что теперь я хотел бы удалить каждый разрыв строки, которая не является непосредственно после ". Как я могу добиться этого с СЭД? Или любая другая программа Баш оболочки ...sed - удалить разрыв строки, если строка не заканчивается на "

Уважением, Snafu

ответ

1

придают этому AWK Однострочник попробовать:

awk '{printf "%s%s",$0,(/"$/?"\n":"")}' file 

тест

kent$ cat f 
"foo" 
"bar" 
"a long 
text with 
many many 
lines" 
"lalala" 

kent$ awk '{printf "%s%s",$0,(/"$/?"\n":"")}' f 
"foo" 
"bar" 
"a longtext withmany manylines" 
"lalala" 
2

Эта sed команда должна это сделать:

sed '/"$/!{N;s/\n//}' file 

Он говорит: в каждой строке, не соответствующего "$ сделать:

  • прочитайте следующую строку, добавьте ее в пространство шаблона;
  • удалить разрыв между двумя линиями.

Пример:

$ cat file.txt 
"test" 
"qwe 
rty" 
foo 
$ sed '/"$/!{N;s/\n//}' file.txt 
"test" 
"qwerty" 
foo 
+0

Я получаю: sed: 1: "/" $ /! {N; s/\ n //} ": bad flag в команде substitute: '}' – SnafuBernd

+0

Я нахожусь на mac. Если это актуально. – SnafuBernd

+0

@SnafuBernd Используете ли вы двойные кавычки для команды sed? Если это так, попробуйте использовать одинарные кавычки. В противном случае это одна из тех особенностей mac sed –

2

Чтобы разработать на @ ответ Льва, BSD, (OSX) версия sed менее прощает о синтаксисе команды внутри cu Rly скобки - команда точки с запятой требуется для обеих команд:

sed '/"$/!{N;s/\n//;}' file.txt 

согласно documentation здесь - отрывок:

После адреса или диапазон адресов, SED принимает фигурные скобки «{. ..} ', поэтому к этой строке или к линиям, соответствующим диапазону адресов, может применяться несколько команд. В командной строке точки с запятой ';' разделяйте каждую инструкцию и должны предшествовать замыканию.

0

Это может работать для вас (GNU СЭД):

sed ':a;/"$/!{N;s/\n//;ta}' file 

Проверяется, если последний символ шаблона является " и если не добавляет еще одну строку, удаляет символ новой строки и повторяется до тех пор условие встречается или встречается конец файла.

Альтернатива:

sed -r ':a;N;s/([^"])\n/\1/;ta;P;D' file 

Механизм остается для читателя обдумать.

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