Как заменить ВСЕ символы новой строки в файле CSV, включая самый последний - PullRequest
0 голосов
/ 25 мая 2018

Я хочу заменить '\n' символы в каждой строке более длинной строкой, например: "___\n".

Когда я пытаюсь:

$ cat /tmp/test.csv | sed ':a;N;$!ba;s/\n/____\n/g'

, я получаю следующий вывод

"00000";"29515470";"001";"001";"A6399000800";"";"";"-1";"142.72";"1.00";"1.00"____
"91930";"20029956";"001";"002";"A2128300018";"";"";"-1";"71.58";"1.00";"4.00"____
"91930";"20029962";"001";"003";"ZZ-OIL16";"";"";"-1";"14.48";"5.00";"3.00"____
"91930";"20029962";"001";"002";"A2661800009";"";"";"-1";"13.28";"1.00";"3.00"

Там, где не заменен самый последний '\ n'.

Но мой CSV-файл выглядит так: enter image description here

Как я могу заменить ВСЕ \n символов?

Я нашел это: Как я могу заменить символ новой строки (\ n) с помощью sed? , но это решение не подходит дляя, потому что он не обрабатывает самый последний '\n' символ.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Использование sed:

$ cat > foo
this
that
$ sed 's/$/__/g' foo
this__
that__

$ sed 's/$/__/g' foo | hexdump -C
00000000  74 68 69 73 5f 5f 0a 74  68 61 74 5f 5f 0a        |this__.that__.|

0a в конце.

PS.Обратите внимание на отсутствие бесполезных cat.

0 голосов
/ 25 мая 2018

Я знаю, что вы не спрашиваете о Perl, но он идеально подходит для этого -

perl -pe 's/$/____/' foo.csv
  • perl -pe запускает данный код для каждой строки каждого данноговходной файл (или стандартный ввод), а затем печатает полученную строку.Код может изменить строку перед выводом.
  • В коде s/$/____/ добавляет четыре подчеркивания в конце строки.

Предполагая, что все строки ввода заканчиваютсяс новыми строками, это ударит все новые строки.Это связано с тем, что в неявном цикле -p используется <>, который включает символ новой строки в том, что получает ваш код.

Подстановка работает, потому что $ соответствует передперевод строки, заканчивающийся строкой .DWIM!

Вывод:

"00000";"29515470";"001";"001";"A6399000800";"";"";"-1";"142.72";"1.00";"1.00"____
 "91930";"20029956";"001";"002";"A2128300018";"";"";"-1";"71.58";"1.00";"4.00"____
 "91930";"20029962";"001";"003";"ZZ-OIL16";"";"";"-1";"14.48";"5.00";"3.00"____
 "91930";"20029962";"001";"002";"A2661800009";"";"";"-1";"13.28";"1.00";"3.00"____

Извините за классное форматирование - четыре пробела у меня почему-то не сработали.

...