Замените \ n на \ r \ n в файле Unix - PullRequest
11 голосов
/ 05 октября 2009

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

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

sed -e 's/\n/\r\n/g' myfile

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

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

Ответы [ 7 ]

16 голосов
/ 05 октября 2009

Когда сталкиваюсь с этим, я использую простой perl однострочный:

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

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

11 голосов
/ 05 октября 2009
  • В чем проблема с получением dos2unix на машину?
  • На какой платформе вы работаете?
  • У вас есть GNU sed или обычный не-GNU sed?

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

sed 's/$/^M/'

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

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

3 голосов
/ 05 октября 2009

Вам не нужна опция -e.

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

sed 's/$/\r/' myfile 
1 голос
/ 12 мая 2016
 sed 's/\([^^M]\)$/\0^M/' your_file

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

1 голос
/ 05 октября 2009

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

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

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

0 голосов
/ 13 декабря 2015

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

echo " this is output" > input
sed 's/$/\r/g' input |od -c
0 голосов
/ 05 октября 2009

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

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...