Заменить 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
или обычный не-GNUsed
?
На Солярис, /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. Это сработало для меня.
может быть, если вы попробуете это так
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