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/

Bogdan Calmac
źródło
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.

Szlomo
źródło
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.

SiegeX
źródło
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.

osoba ubiegająca się o
źródło
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

Buckley
źródło
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.

Vadzim
źródło