Как использовать sed для замены LF пробелом, но не CRLF? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть CSV-файл, в котором есть смесь CRLF и LF .В некоторых точках есть LF , где на самом деле контент принадлежит предыдущей строке.

Пример:

smith;pete;he is very nice;1990CRLF
brown;mark;he is very nice;2010CRLF
taylor;sam;he isLF
very nice;2009CRLF

В моем скрипте я хочу удалить все автономные экземпляры LF .Я попытался использовать sed:

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' $my_file

Проблема с этим решением заключается в том, что LF s, принадлежащие CRLF s, также заменяются пробелом.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

С perl, который не удаляет разделитель записей по умолчанию - и, таким образом, позволяет легко манипулировать

$ cat -A ip.txt
smith;pete;he is very nice;1990^M$
brown;mark;he is very nice;2010^M$
taylor;sam;he is$
very nice;2009^M$

$ perl -pe 's/(?<!\r)\n/ /' ip.txt
smith;pete;he is very nice;1990
brown;mark;he is very nice;2010
taylor;sam;he is very nice;2009

$ perl -pe 's/(?<!\r)\n/ /' ip.txt | cat -A
smith;pete;he is very nice;1990^M$
brown;mark;he is very nice;2010^M$
taylor;sam;he is very nice;2009^M$

(?<!\r)\n использует отрицательный просмотр, чтобы гарантировать, что мы заменим \n только тогда, когда онне предшествует \r


Изменение попытки OP:

$ sed -e ':a' -e 'N' -e '$!ba' -e 's/\([^\r]\)\n/\1 /g' ip.txt
smith;pete;he is very nice;1990
brown;mark;he is very nice;2010
taylor;sam;he is very nice;2009

\([^\r]\), чтобы символ, предшествующий \n, не был \r

0 голосов
/ 07 июня 2018

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

$ awk 'BEGIN{RS=ORS="\r\n"}/\n/{sub(/\n/,"")}1' file
smith;pete;he is very nice;1990
brown;mark;he is very nice;2010
taylor;sam;he isvery nice;2009

Объяснение:

$ awk '
BEGIN { RS=ORS="\r\n" }  # set the record separators to CRLF
/\n/ {                   # if there is stray LF in the record
    sub(/\n/,"")         # remove it (maybe " " to replace it with a space)
}1' file                 # output it

Успешно протестировано на awk gawk, mawk и Busybox.Сбой с BSD awk, используйте, например:

awk '!/\r$/{printf "%s",$0;next}1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...