Удаление возврата каретки в Mac OS X с помощью sed

В Linux для удаления возврата каретки мы можем выполнить:

sed -i 's/\r//g' <file>

Но то же самое не будет работать в Mac OS X. Необходимо добавить $ как:

sed -i $'s/\r//' <file>

И "g" также не требуется.

Почему это так?

Ответ 1

Это потому, что sed, доступный в OSX, не распознает \r как специальный символ, в отличие от sed в Linux.

Вы можете использовать его так, как вы используете:

sed -i.bak $'s/\r//' file

ИЛИ это:

sed -i.bak "s/$(printf '\r')//" file

ИЛИ иначе вы можете использовать tr в OSX:

tr -d '\r' < file

Ответ 2

Другим портативным и гибким решением является:

sed -i.bak $'s/\x0D//' file

Поскольку символ возврата имеет код ASCII 0D.\x заменяет работу для всех выпусков POSIX sed, и вы можете сопоставить любой другой неприятный символ, просмотрев код ASCII. См.: re_format (7), Таблица ASCII