Збережіть закінчення рядків


111

Я запускаю sed, щоб зробити деяку заміну на Windows, і я помітив, що він автоматично перетворює закінчення рядків в 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
Ви можете використовувати СЕД (без будь - яких спеціальних опцій) + Unix2Dos
MEMS

Відповіді:


143

Ви можете використовувати -bопцію sed, щоб вона розглядала файл як бінарний. Це дозволить виправити проблему з sed-цигуном на 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.
Шентіл Кумаран

21
Для мене працює навіть з sed -i: просто важливо, як це набрати. Хоча sed -biі sed -i -bробота, sed -ibробить НЕ роботу: см сторінку людини, чому (використовує в bякості суфікса для резервної копії).
Олаф Мандель

2
Використання:sed -bi 's/foo/bar/'
Kunal B.

2
Не працює для мене в Windows cygwin. На лініях, які sed внесли зміни, закінчення рядків є Unixy. Решта рядків мають закінчення віконних рядків. Таким чином мій файл отримав змішаний рядок з різними закінченнями рядків.
truthadjustr

10

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

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

чи, можливо,

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

Якщо жоден з перерахованих вище двох не працює, вам доведеться ознайомитися з певною сторінкою для вашої версії, sedщоб побачити, чи існує така опція. Зверніть увагу , що * NIX версії з sedцього НЕ змінити термінатори лінії без слів , щоб зробити це.

Іншою альтернативою є використання cygwinверсії, в sedякій не повинно бути такої небажаної поведінки.


15
Версія cygwin має таку небажану поведінку.
гарпо

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 (вбудований) зіпсує його.

Напр. 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 sed windows .

Зауважте, що gnuwin32 sed 4.2.1 робить пошкоджені закінчення рядків у -biрежимі і взагалі не має -zрежиму.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.