Сохранить окончания строк

111

Я запускаю sed, чтобы сделать некоторую замену в окнах, и заметил, что он автоматически преобразует окончания строк в Unix (\ n). Есть ли возможность указать sed использовать окончания строк Windows (\ r \ n) или даже лучше сохранить окончания строк из файла?

Примечание: я использую sed из unxutils: http://unxutils.sourceforge.net/

Богдан Калмак
источник
2
Приведенные ниже решения не работают в macOS.
Уильям Энтрикен
Я даже LC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
зашел так
Так что на самом деле приведенная выше команда действительно работает, и я только что обнаружил ошибку в git diffпрограмме.
Уильям Энтрикен
1
Вы можете использовать sed (без каких-либо специальных опций) + unix2dos
mems

Ответы:

143

Вы можете использовать -bпараметр sed, чтобы он обрабатывал файл как двоичный. Это решит проблему с sed cygwin в Windows.

Пример: sed -b 's/foo/bar/'

Если вы хотите сопоставить конец строки, не забудьте сопоставить, зафиксировать и скопировать дополнительный возврат каретки.

Пример: sed -b 's/foo\(\r\?\)$/bar\1/'

На странице руководства по sed :

-b - двоичный

Этот параметр доступен на каждой платформе, но эффективен только тогда, когда операционная система делает различие между текстовыми файлами и двоичными файлами. Когда проводится такое различие - как в случае с MS-DOS, Windows, Cygwin - текстовые файлы состоят из строк, разделенных символом возврата каретки и символа перевода строки, и sed не видит завершающий CR. Когда указана эта опция, sed будет открывать входные файлы в двоичном режиме, таким образом, не запрашивая эту специальную обработку и считая строки заканчивающимися переводом строки.

Шломо
источник
5
Обратите внимание, что это не работает с sed -icygwin (для меня), но вы можете обойти это. Спасибо за обновление - другие ответы какое-то время были последним словом на эту тему.
harpo
Обратите внимание: эта опция недоступна в sed на Mac.
Senthil Kumaran
21
У меня работает даже с sed -i: просто важно, как это набрать. Хотя sed -biи sed -i -bработа, sed -ibделает не работу: см страницу человека, почему (использует в bкачестве суффикса для резервной копии).
Олаф Мандель
2
Использование:sed -bi 's/foo/bar/'
Кунал Б.
2
У меня не работает в Windows cygwin. В строках, в которых sed внес изменения, окончание строки - Unixy. Остальные строки имеют оконные окончания. Таким образом, в моем файле было несколько строк с разными окончаниями.
truthadjustr
10

Вы можете попробовать добавить \nfor \r\nв конце вашего существующего скрипта, например:

sed 's/foo/bar/;s/$/\r/'

или возможно

 sed -e 's/foo/bar/' -e 's/$/\r/'

Если ни один из вышеперечисленных двух не работает, вам нужно будет проконсультироваться со специальной страницей руководства для вашей версии, sedчтобы узнать, существует ли такая опция. Обратите внимание , что * NIX версии из sedэтого не изменить терминаторы линии без слов , чтобы сделать это.

Другой альтернативой является использование cygwinверсии, в sedкоторой не должно быть такого нежелательного поведения.

SiegeX
источник
15
Версия cygwin действительно имеет такое нежелательное поведение.
harpo
2
Если файл содержит как \ n ( 0x0A), так и \ r \ n ( 0x0D 0x0A) - это предлагаемое решение (всегда повторно вводить \ r) нарушает его.
Влад
У меня это работает с использованием MSYS2 / MinGW. Спасибо @SiegeX.
AntumDeluge
6

В качестве альтернативы (версия cygwin) perl -pe, похоже, не имеет этой проблемы.

ищущий
источник
sed в MacOS не имеет опции -b и имеет проблемы, аналогичные описанным в исходном вопросе. Альтернатива perl не имеет этой проблемы, поэтому спасибо за ваше предложение. sed -i -e 's/<img[^>]*\/>//g' *.xmlзаменяет окончания строк на '\ n', perl -i -p -e 's/<img[^>]*\/>//g' *.xmlсохраняет исходные окончания строк
Guruniverse
2

Gnuwin может быть подавлен, чтобы испортить новые строки (win-> unix), если вы укажете только переключатель -b и перенаправить. Использование переключателя -i (inline) может испортить его.

Например, sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv

Бакли
источник
1
Вариант с рабочим -iрежимом смотрите в моем ответе .
Вадим
2

Я обнаружил , что sed-4.4.exeиз https://github.com/mbuilov/sed-windows чистая победа в ней

  • использует окончания строк Windows CRLF в режиме по умолчанию
  • сохраняет исходные окончания строк в -bрежиме
  • корректно работает с -iрежимом на месте
  • также предлагает -zрежим с \0разделителями, вместо \nкоторых иногда тоже может быть удобно

См. Также список параметров sed и список всех портов sed для Windows .

Обратите внимание , что gnuwin32 СЭД 4.2.1 делает коррумпированные окончаний строк в -biрежиме и не имеет -zрежима на всех.

Вадим
источник