Заменить n на rn в файле Unix

Я пытаюсь сделать наоборот этот вопрос, заменяя окончания строк Unix окончаниями строк Windows, так что я могу используйте SQL Server bcp через samba для импорта файла. У меня sed установлен, но не dos2unix. Я попытался изменить примеры, но безрезультатно.

вот команда, которую я использую.

sed -e 's/n/rn/g' myfile

Я выполнил это, а потом побежал od -c myfile, ожидая увидеть rn где раньше было n. Но там все еще n. (Или, по крайней мере, так кажется. Выход od переполняет мой буфер экрана, поэтому я не вижу начало файла).

Я не смог понять, что я делаю неправильно. Есть предложения?

7 ответов


  • в чем проблема с получением dos2unix на машине?
  • С какой платформой вы работаете?
  • у вас есть GNU sed или обычный не-GNU sed?

На Солярис, /usr/bin/sed требуется:

sed 's/$/^M/'

где я ввел "^M", набрав управленияV управленияM. "$"Совпадает в конце строки и заменяет конец строки на control-M. вы можете написать это тоже.

механизмы ожидал sed расширить '\r' или '\r' для управления-M будут в лучшем случае специфичными для платформы.


столкнувшись с этим, я использую простой perl сценарий:

perl -pi -e 's/\n/\r\n/' filename

, потому что sed поведение меняется, и я знаю, что это работает.


вам не нужно .

$ соответствует символу конечной строки. Это вставить \r символ перед концом строки:

sed 's/$/\r/' myfile 

просто добавив \r (Он же ^M, см. ответ Джонатана Леффлера) перед \n небезопасно, потому что файл может иметь смешанный режим EOL, поэтому вы рискуете в конечном итоге с некоторыми строками becomming \r\r\n. Безопасная вещь - сначала удалить все символы "\r", а затем вставить (один) \r до \n.

#!/bin/sh
sed 's/^M//g' ${1+"$@"} | sed 's/$/^M/'

обновлено для использования ^M.


 sed 's/\([^^M]\)$/^M/' your_file

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


попробуйте использовать:

echo " this is output" > input
sed 's/$/\r/g' input |od -c

может быть, если вы попробуете это так

cat myfile | sed 's/\n/\r\n/g' > myfile.win

будет работать, из моего понимания, что вы просто делаете замены на вывод консоли, вам нужно перенаправить вывод в файл, в этом случае myfile.win, тогда вы можете просто переименовать его в то, что хотите. Весь скрипт будет (работает внутри каталога, полного таких файлов):

#!/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