Zachowaj zakończenia linii


111

Uruchomiłem seda, aby dokonać podmiany w systemie Windows i zauważyłem, że automatycznie konwertuje on zakończenia linii na Uniksa (\ n). Czy jest opcja, aby powiedzieć sedowi, aby używał zakończeń linii Windows (\ r \ n) lub nawet lepiej, aby zachować końce linii z pliku?

Uwaga: używam seda z unxutils: http://unxutils.sourceforge.net/


2
Poniższe rozwiązania nie działają w systemie macOS.
William Entriken

Dotarłem nawet tak daleko i nadal nie działałoLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken

Więc faktycznie powyższe polecenie działa i właśnie odkryłem błąd w git diffprogramie.
William Entriken

1
Możesz użyć sed (bez żadnych specjalnych opcji) + unix2dos
mems

Odpowiedzi:


143

Możesz użyć -bopcji seda, aby traktował plik jako binarny. To rozwiąże problem z sedem cygwina w systemie Windows.

Przykład: sed -b 's/foo/bar/'

Jeśli chcesz dopasować koniec linii, pamiętaj o dopasowaniu, przechwyceniu i skopiowaniu opcjonalnego powrotu karetki.

Przykład: sed -b 's/foo\(\r\?\)$/bar\1/'

Ze strony podręcznika seda :

-b --binarne

Ta opcja jest dostępna na każdej platformie, ale jest skuteczna tylko wtedy, gdy system operacyjny rozróżnia pliki tekstowe i pliki binarne. Kiedy dokonuje się takiego rozróżnienia - jak w przypadku MS-DOS, Windows, Cygwin - pliki tekstowe składają się z wierszy oddzielonych znakiem powrotu karetki i znaku nowego wiersza, a sed nie widzi końcowej litery CR. Gdy ta opcja jest określona, ​​sed otworzy pliki wejściowe w trybie binarnym, nie żądając w ten sposób specjalnego przetwarzania i rozważając, że wiersze kończą się znakiem wysuwu wiersza.


5
Zauważ, że to nie działa z sed -icygwin (dla mnie), ale możesz to obejść. Dzięki za aktualizację - pozostałe odpowiedzi były przez chwilę ostatnim słowem na ten temat.
harpo

Uwaga, ta opcja nie jest dostępna w przypadku seda na komputerze Mac.
Senthil Kumaran

21
U mnie działa nawet z sed -i: ważne jest tylko, jak to wpisać. Choć sed -bii sed -i -bpracy, sed -ibczy nie pracy: patrz strony man dlaczego (używa bjako przyrostek dla kopii zapasowej).
Olaf Mandel

2
Użyj:sed -bi 's/foo/bar/'
Kunal B.

2
Nie działa u mnie w Windows Cygwin. W liniach, które wprowadziły zmianę, zakończenia linii to Unixy. Pozostałe linie mają zakończenia linii Windowish. W ten sposób mój plik zawiera mieszankę linii z różnymi zakończeniami linii.
trueadjustr

10

Możesz spróbować dodać \nfor \r\nna końcu istniejącego skryptu w następujący sposób:

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

a może

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

Jeśli żadna z powyższych dwóch nie zadziała, będziesz musiał zajrzeć do konkretnej strony podręcznika dla twojej wersji, sedaby sprawdzić, czy taka opcja istnieje. Należy pamiętać, że * nix wersje o sednie nie zmieniają terminatory linii bez słów, aby to zrobić.

Inną alternatywą jest użycie cygwinwersji, sedktóra nie powinna mieć tego niepożądanego zachowania.


15
Wersja cygwin ma to niepożądane zachowanie.
harpo

2
Jeśli plik zawiera zarówno \ n ( 0x0A), jak i \ r \ n ( 0x0D 0x0A) - to proponowane rozwiązanie (zawsze ponowne wstrzykiwanie \ r) przerywa go.
Vlad

To działa dla mnie przy użyciu MSYS2 / MinGW. Dziękuję @SiegeX.
AntumDeluge

6

Alternatywnie (wersja cygwin) perl -penie wydaje się mieć tego problemu.


sed na MacOS nie ma opcji -b i ma podobne problemy, jak opisano w oryginalnym pytaniu. Alternatywa dla Perla nie ma tego problemu, więc dziękuję za sugestię. sed -i -e 's/<img[^>]*\/>//g' *.xmlzamienia zakończenia linii na „\ n” perl -i -p -e 's/<img[^>]*\/>//g' *.xmlzachowuje oryginalne zakończenia linii
Guruniverse

2

Gnuwin można powstrzymać, aby zepsuć znaki nowej linii (win-> unix), jeśli podasz tylko przełącznik -b i przekierowanie. Użycie przełącznika -i (inline) zepsuje to.

Np. Sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv


1
Zobacz wersję z -itrybem pracy w mojej odpowiedzi .
Vadzim

2

Odkryłem, że sed-4.4.exez https://github.com/mbuilov/sed-windows jest czysta wygrana

  • używa zakończenia linii Windows CRLF w trybie domyślnym
  • zachowuje oryginalne zakończenia linii w -btrybie
  • działa poprawnie w -itrybie w miejscu
  • oferuje również -ztryb z \0delimeters zamiast \nktóre mogą być przydatne czasami zbyt

Zobacz także listę opcji seda i listę wszystkich portów sed w systemie Windows .

Zauważ, że GnuWin32 sed 4.2.1 robi uszkodzonych zakończeń linii w -bitrybie i nie ma -ztrybu wcale.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.