Замените\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