Замените\n на \r\n в файле Unix
Я пытаюсь сделать обратное этому вопросу, заменив окончание строк Unix на окончание строк Windows, чтобы я мог используйте SQL Server bcp над samba для импорта файла. У меня установлен sed
, но не dos2unix
. Я попытался обратить вспять примеры, но безрезультатно.
Здесь используется команда, которую я использую.
sed -e 's/\n/\r\n/g' myfile
Я выполнил это, а затем запустил od -c myfile
, ожидая увидеть \r\n
, где раньше был \n
. Но там все еще \n
. (Или, по крайней мере, они кажутся. Выход od переполняет мой экранный буфер, поэтому я не вижу начало файла).
Я не смог понять, что я делаю неправильно. Любые предложения?
Ответы
Ответ 1
- В чем проблема с получением
dos2unix
на машине?
- С какой платформой вы работаете?
- У вас есть GNU
sed
или обычный не-GNU sed
?
В Solaris для /usr/bin/sed
требуется:
sed 's/$/^M/'
где я ввел '^ M', набрав control V control M. "$" Совпадает в конце строки и заменяет конец строки на control-M. Вы можете также script.
Механизмы, ожидающие sed
для расширения '\r
' или '\\r
' для управления-M, будут в лучшем случае ориентированы на платформу.
Ответ 2
Когда я сталкиваюсь с этим, я использую простой perl
однострочный:
perl -pi -e 's/\n/\r\n/' filename
потому что поведение sed
меняется, и я знаю, что это работает.
Ответ 3
Вам не нужна опция -e
.
$
соответствует символу конца строки. Эта команда sed
будет вставлять символ \r
до конца строки:
sed 's/$/\r/' myfile
Ответ 4
Просто добавление \r
(aka ^M
, см. ответ Джонатана Леффлера) перед \n
небезопасно, потому что файл может иметь смешанный режим EOL, поэтому вы рискуете оказаться в некоторых строках, за исключением \r\r\n
. Безопасная вещь - сначала удалить все символы '\ r', а затем вставить (один) \r
до \n
.
#!/bin/sh
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/'
Обновлено для использования ^M
.
Ответ 5
sed 's/\([^^M]\)$/\0^M/' your_file
Это гарантирует, что вы вставляете только \r, если перед \n не существует \r. Это сработало для меня.
Ответ 6
Попробуйте использовать:
echo " this is output" > input
sed 's/$/\r/g' input |od -c
Ответ 7
Возможно, если вы попробуете это так
cat myfile | sed 's/\n/\r\n/g' > myfile.win
будет работать, исходя из моего понимания, что вы просто делаете замены на выходе консоли, вам нужно перенаправить вывод в файл, в этом случае myfile.win, тогда вы можете просто переименовать его в любое нужное вам. Целый script будет (работает внутри каталога, заполненного такими файлами):
#!/bin/bash
for file in $(find . -type f -name '*')
do
cat $file | sed 's/\n/\r\n/g' > $file.new
mv -f $file.new $file
done