Сохранение окончаний линии

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

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

Ответ 1

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

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

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

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

На странице sed man:

-b -binary

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

Ответ 2

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

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

или, возможно,

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

См. также список параметров sed и список всех подключаемых портов Windows.

Обратите внимание, что gnuwin32 sed 4.2.1 коррумпированные окончания строк в -bi и не имеет режима -z вообще.