2009-10-05 4 views
10

Я пытаюсь сделать обратное this question, заменив окончание строк Unix концами строк Windows, чтобы я мог use SQL Server bcp over samba to import the file. У меня установлен sed, но не dos2unix. Я попытался обратить вспять примеры, но безрезультатно.Замените n на r n в файле Unix

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

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

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

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

+0

У вас нет компилятора? –

+0

Какой компилятор? –

+0

для просмотра верхней части файла: od -c filename | меньше –

ответ

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

В Solaris /usr/bin/sed требуется:

sed 's/$/^M/' 

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

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

+0

Это сделало трюк. Я мог бы получить dos2unix там, но я надеялся использовать существующее программное обеспечение. Я нахожусь в AIX. Я предполагаю, что это версия, отличная от GNU. Теперь, когда вы упомянули об этом, я использовал контрольный трюк control-v в vi раньше, должен был подумать об этом. Благодарю. –

-1

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

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 
+1

-1. не работает для меня. – Peter

+0

хорошо определен для платформы, ответ Джонатана Леффлера лучше – Juparave

3

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

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

sed 's/$/\r/' myfile 
+1

Спасибо за предложение, но по какой-то причине это просто вставляет r в конец файла. –

+0

Согласно руководству по эксплуатации для GNU sed: «Все введенные здесь escape-последовательности являются расширениями GNU, за исключением' \ n '. ". – hlovdal

+0

Моя ошибка в том, что вы не указали аромат Unix. Я использую AIX. +1 за то, что первым указал, что я должен искать $ вместо \ n. –

13

Столкнувшись с этим, я использую простую perl Однострочник:

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

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

+0

Да, это лучший переносной вариант. Введенные вручную^М и ненадежные разложения выше - это showstoppers. –

1

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

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

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

0

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

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

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

Смежные вопросы