замена sed с использованием амперсанда (&)

Я искал высоко и низко и надеюсь, что вы можете мне помочь. Мне нужно найти каждую строку в файле, которая НЕ начинается с двойной кавычки (""), и добавить эту строку к предыдущей строке.

Я успешно сделал это, используя следующую команду:

кот имя_файла.csv | sed -e :a -e '$!Ns/\n[^"]//;ta -e 'P;D' > newfilename.csv

Моя проблема в замене. Как и следовало ожидать, после добавления строки к предыдущей строке первый символ удаляется. Мне нужно, чтобы его не удаляли. Я попробовал cat filname.csv | sed -e :a -e '$!Ns/\n[^"]/&/;ta -e 'P;D' > newfilename.csv

но он просто висит. Я думал, что амперсанд (&) скопирует совпадающую строку.

Вход:

"line 1
<line 2>

Вывод с существующей или первой командой sed: lineline2> ** Обратите внимание на удаление ‹

Мне нужно, чтобы вывод был line1<line2>

Любая помощь, которую вы можете предоставить, будет ОЧЕНЬ оценена!!


person Susan Anne    schedule 15.03.2011    source источник


Ответы (4)


Кажется, я не могу заставить вашу исходную команду работать. Вы где-то пропустили одинарную кавычку?

Предполагая, что исходная команда работает и я помню, как работает sed, я бы просто использовал обратные ссылки, например:

sed -e :a -e '$!Ns/\n([^"])/\1/;ta -e 'P;D'

(добавлены круглые скобки и заменены & на \1)

person sapphiremirage    schedule 15.03.2011

Вам не хватает закрывающей одинарной кавычки, поэтому оболочка интерпретирует амперсанд как запрос на выполнение операции в фоновом режиме. Пытаться:

sed -e ':a' -e '$!Ns/\n\([^"]\)/\1/;ta' -e 'P;D' filname.csv > newfilename.csv

В любом случае вы не можете использовать амперсанд, потому что это сохранит новую строку.

person Dennis Williamson    schedule 15.03.2011

Вы также можете сделать это с помощью awk:

awk '{if (NR>1 && $1 ~ "^\"") print "" ; printf $0 } END {print ""}' filname.csv > newfilename.csv
person mpapis    schedule 16.03.2011

$ cat file
"line 1
<line 2>
"line 3
<line 4>

$ awk 'ORS=/^\042/?" ":"\n"' file
"line 1 <line 2>
"line 3 <line 4>

или если бы вы могли использовать Ruby (1.9+)

$ ruby -ne 'print /^"/? $_.chomp: $_' file
"line 1<line 2>
"line 3<line 4>
person kurumi    schedule 16.03.2011