замещение с помощью амперсанда (&) - PullRequest
0 голосов
/ 15 марта 2011

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

Я успешно выполнил это с помощью следующей команды:

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

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

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

Ввод:

"line 1
<line 2>

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

Мне нужно, чтобы результат был line1<line2>

. Любая помощь, которую вы можете оказать, будет с благодарностью принята !!

Ответы [ 4 ]

0 голосов
/ 16 марта 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>
0 голосов
/ 15 марта 2011

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

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

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

0 голосов
/ 16 марта 2011

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

awk '{if (NR>1 && $1 ~ "^\"") print "" ; printf $0 } END {print ""}' filname.csv > newfilename.csv
0 голосов
/ 15 марта 2011

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

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

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

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

...