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

Я хочу заменить символы '\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-файл выглядит так: введите здесь описание изображения

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

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


person elaspog    schedule 25.05.2018    source источник
comment
Как насчет просто awk '{print $0"____"}' /tmp/test.csv   -  person Inian    schedule 25.05.2018
comment
Благодарю вас! Это тоже хорошее решение. Но здесь я должен использовать sed...   -  person elaspog    schedule 25.05.2018
comment
Stack Overflow не является сервисом для написания кода. Пожалуйста, покажите свой код. Поскольку переполнение стека скрывает от вас причину закрытия: Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения в самом вопросе. . Вопросы без четкой формулировки проблемы бесполезны для других читателей. См. раздел Как создать минимальный, полный и проверяемый пример.   -  person jww    schedule 26.05.2018


Ответы (2)


Использование 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.

person James Brown    schedule 25.05.2018

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

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

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

Замена работает, потому что $ соответствует перед новой строкой, завершающей строку. ДВИМ!

Выход:

"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"____

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

person cxw    schedule 25.05.2018
comment
Нет, я не могу использовать Perl, извините. - person elaspog; 25.05.2018
comment
@user1802693 user1802693 Ну что ж. Я вижу, что уже есть по крайней мере один другой ответ, поэтому я надеюсь, что один из них сработает! - person cxw; 25.05.2018