Сохранение окончаний линии
Я запускаю 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
вообще.