Сохранить окончания строки - PullRequest
102 голосов
/ 11 января 2011

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

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

Ответы [ 5 ]

131 голосов
/ 16 июля 2012

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

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

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

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

со страницы руководства sed :

-b --binary

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

10 голосов
/ 11 января 2011

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

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

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

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

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

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

6 голосов
/ 28 ноября 2011

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

2 голосов
/ 16 октября 2017

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

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

1 голос
/ 15 декабря 2017

Я обнаружил, что sed-4.4.exe из https://github.com/mbuilov/sed-windows - это чистый выигрыш, так как

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

См. также список параметров Sed и список всех портов Windows Sed .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...