Удалить ^ M символов из файла с помощью sed

У меня есть эта строка внутри файла:

ULNET-PA,client_sgcib,broker_keplersecurities
,KEPLER

Я пытаюсь избавиться от символа ^ M (возврат каретки), поэтому я использовал:

sed 's/^M//g'

Однако это удаляет все после ^ M:

[[email protected] tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER

[[email protected] tmp]# sed 's/^M//g' test
ULNET-PA,client_sgcib,broker_keplersecurities

Я хочу получить:

[[email protected] tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities,KEPLER

Ответ 1

Используйте tr:

tr -d '^M' < inputfile

(Обратите внимание, что символ ^M может быть введен с использованием Ctrl+V Ctrl+M)


EDIT: предложил Glenn Jackman, если вы используете bash, вы можете также скажите:

tr -d $'\r' < inputfile

Ответ 2

по-прежнему одна и та же строка:

sed -i 's/^M//g' file

когда вы вводите команду, для ^M введите Ctrl+V Ctrl+M

На самом деле, если вы уже открыли файл в vim, вы можете просто сделать vim:

:%s/^M//g

то же самое, ^M введите Ctrl-V Ctrl-M

Ответ 3

alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "

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

dos2unix file

Ответ 4

Вы можете просто использовать dos2unix, который доступен в большинстве систем Unix/Linux. Однако я нашел следующую команду sed лучше, поскольку она удаляла ^ M, где dos2unix не мог:

sed 's/\r//g' < input.txt >  output.txt

Надеюсь, что это поможет.

Примечание: ^ M - фактически символ возврата каретки, который представлен в коде как \r То, что dos2unix делает, скорее всего, эквивалентно:

sed 's/\r\n/\n/g' < input.txt >  output.txt

Он не удаляет \r, когда он не сразу следует \n и заменяет оба только \n. Это терпит неудачу с некоторыми типами файлов, как тот, который я только что тестировал.

Ответ 5

Если Perl является опцией:

perl -i -pe 's/\r\n$/\n/g' file

-i создает .bak версию входного файла
\r= возврат каретки
\n= linefeed
$= конец строки
s/foo/bar/g= глобально заменить "foo" на "bar"

Ответ 6

Я согласен с @twalberg (см. ответы на ответ, выше), dos2unix на Mac OSX охватывает это, цитируя man dos2unix:

Для запуска в режиме Mac используйте параметр командной строки "-c mac" или используйте команды "mac2unix" или "unix2mac"

Я остановился на 'mac2unix', который избавился от моих менее cmd-видимых записей '^ M', введенных передачей Apple "сообщений" bash script между 2 Yosemite (OSX 10.10) Mac

Я установил 'dos2unix', тривиально, на Mac OSX, используя популярный Главная brew установщик пакетов, Я настоятельно рекомендую его и команду companion, Cask.

Ответ 7

В awk:

sub(/\r/,"")

Если это в конце записи, sub(/\r/,"",$NF) должно быть достаточно. Нет необходимости сканировать всю запись.