Giữ nguyên phần cuối dòng


111

Tôi chạy sed để thực hiện một số thay thế trên windows và tôi nhận thấy rằng nó tự động chuyển đổi phần cuối dòng thành Unix (\ n). Có tùy chọn nào để yêu cầu sed sử dụng phần cuối dòng Windows (\ r \ n) hoặc thậm chí tốt hơn để bảo toàn phần cuối dòng khỏi tệp không?

Lưu ý: Tôi sử dụng sed từ unxutils: http://unxutils.sourceforge.net/


2
Các giải pháp dưới đây không hoạt động trên macOS.
William Entriken

Tôi thậm chí đã nhận này đến nay và nó vẫn không làm việcLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken

Vì vậy, thực sự lệnh trên hoạt động và tôi vừa phát hiện ra một lỗi trong git diffchương trình.
William Entriken

1
Bạn có thể sử dụng sed (không có bất kỳ tùy chọn đặc biệt nào) + unix2dos
mems

Câu trả lời:


143

Bạn có thể sử dụng -btùy chọn cho sed để nó coi tệp là tệp nhị phân. Điều này sẽ khắc phục sự cố với sed của cygwin trên Windows.

Thí dụ: sed -b 's/foo/bar/'

Nếu bạn muốn khớp với cuối dòng, hãy nhớ khớp, chụp và sao chép ký tự xuống dòng tùy chọn.

Thí dụ: sed -b 's/foo\(\r\?\)$/bar\1/'

Từ trang sed man :

-b --binary

Tùy chọn này có sẵn trên mọi nền tảng, nhưng chỉ hiệu quả khi hệ điều hành phân biệt giữa tệp văn bản và tệp nhị phân. Khi có sự phân biệt như vậy — như trường hợp của MS-DOS, Windows, Cygwin — các tệp văn bản bao gồm các dòng được phân tách bằng ký tự xuống dòng và ký tự nguồn cấp dòng, và sed không nhìn thấy CR kết thúc. Khi tùy chọn này được chỉ định, sed sẽ mở các tệp đầu vào ở chế độ nhị phân, do đó không yêu cầu xử lý đặc biệt này và xem xét các dòng kết thúc ở nguồn cấp dữ liệu dòng. '


5
Lưu ý rằng điều này không hoạt động với sed -icygwin (đối với tôi), nhưng bạn có thể khắc phục điều đó. Cảm ơn bạn đã cập nhật - những câu trả lời khác là lời cuối cùng về chủ đề này trong một thời gian.
harpo

Lưu ý, tùy chọn này không khả dụng với sed trên Mac.
Senthil Kumaran

21
Phù hợp với tôi ngay cả với sed -i: điều quan trọng là cách gõ nó. Trong khi sed -bised -i -bnơi làm việc, sed -ibthực hiện không làm việc: xem man page của sao (sử dụng bnhư là hậu tố cho các bản sao lưu).
Olaf Mandel

2
Sử dụng:sed -bi 's/foo/bar/'
Kunal B.

2
Không hoạt động đối với tôi trong Windows cygwin. Trên các dòng mà sed đã thực hiện thay đổi, phần cuối của dòng là Unixy. Các dòng còn lại có đuôi dòng Windowish. Vì vậy, tệp của tôi có một hỗn hợp các dòng với các kết thúc dòng khác nhau.
truthadjustr

10

Bạn có thể thử sub \ncho \r\nở cuối tập lệnh hiện có của mình như sau:

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

hoặc có lẽ

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

Nếu cả hai cách trên đều không hoạt động, bạn sẽ phải tham khảo trang người dùng cụ thể cho phiên bản của bạn sedđể xem liệu tùy chọn như vậy có tồn tại hay không. Lưu ý rằng các phiên bản * nix của sedta không thay đổi Terminators dòng mà không bị bảo phải làm như vậy.

Một lựa chọn khác là sử dụng các cygwinphiên bản của sedkhông nên có hành vi không mong muốn này.


15
Phiên bản cygwin có hành vi không mong muốn này.
harpo

2
Nếu tệp chứa cả \ n ( 0x0A) và \ r \ n ( 0x0D 0x0A) - giải pháp được đề xuất này (luôn chèn lại \ r) sẽ phá vỡ tệp đó.
Vlad

Điều này phù hợp với tôi khi sử dụng MSYS2 / MinGW. Cảm ơn bạn @SiegeX.
AntumDeluge

6

Ngoài ra, (phiên bản cygwin của) perl -pedường như không gặp sự cố này.


sed trên MacOS không có tùy chọn -b và có các vấn đề tương tự như được mô tả trong câu hỏi ban đầu. Giải pháp thay thế perl không có vấn đề này, vì vậy cảm ơn đề xuất của bạn. sed -i -e 's/<img[^>]*\/>//g' *.xmlthay thế phần cuối dòng bằng '\ n' perl -i -p -e 's/<img[^>]*\/>//g' *.xmlgiữ nguyên phần cuối dòng ban đầu
Guruniverse

2

Gnuwin có thể bị chặn để làm rối các dòng mới (win-> unix) nếu bạn chỉ chỉ định chuyển hướng -b và chuyển hướng. Việc sử dụng -i (nội tuyến) sẽ làm rối tung nó.

Ví dụ: sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv


1
Xem phiên bản có -ichế độ làm việc trong câu trả lời của tôi .
Vadzim

2

Tôi thấy rằng sed-4.4.exetừ https://github.com/mbuilov/sed-windows là chiến thắng thuần túy vì nó

  • sử dụng kết thúc dòng CRLF của cửa sổ ở chế độ mặc định
  • giữ nguyên phần cuối dòng gốc ở -bchế độ
  • hoạt động chính xác với -ichế độ tại chỗ
  • cũng cung cấp -zchế độ với máy đo \0mê sảng thay vì chế độ \nnày đôi khi cũng có thể hữu ích

Xem thêm danh sách các tùy chọn seddanh sách tất cả các cổng sed của Windows .

Lưu ý rằng gnuwin32 sed 4.2.1 làm hỏng kết thúc dòng trong -bichế độ và không có -zchế độ nào cả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.