Pertahankan ujung garis

111

Saya menjalankan sed untuk melakukan substitusi pada windows dan saya perhatikan bahwa itu secara otomatis mengubah akhiran baris menjadi Unix (\ n). Apakah ada opsi untuk memberi tahu sed untuk menggunakan akhiran baris Windows (\ r \ n) atau bahkan lebih baik untuk mempertahankan akhir baris dari file?

Catatan: Saya menggunakan sed dari unxutils: http://unxutils.sourceforge.net/

Bogdan Calmac
sumber
2
Solusi di bawah ini tidak berfungsi di macOS.
William Entriken
Saya bahkan sampai sejauh ini dan masih tidak berhasilLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken
Jadi sebenarnya perintah di atas berfungsi dan saya baru saja menemukan bug di git diffprogram.
William Entriken
1
Anda dapat menggunakan sed (tanpa opsi khusus) + unix2dos
mems

Jawaban:

143

Anda dapat menggunakan -bopsi sed agar memperlakukan file sebagai biner. Ini akan memperbaiki masalah dengan cygwin sed di Windows.

Contoh: sed -b 's/foo/bar/'

Jika Anda ingin mencocokkan akhir baris, ingatlah untuk mencocokkan, tangkap, dan salin carriage return opsional.

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

Dari halaman manual sed :

-b --binary

Opsi ini tersedia di setiap platform, tetapi hanya efektif jika sistem operasi membuat perbedaan antara file teks dan file biner. Ketika perbedaan tersebut dibuat — seperti pada MS-DOS, Windows, Cygwin — file teks terdiri dari baris-baris yang dipisahkan oleh carriage return dan karakter line feed, dan sed tidak melihat akhir CR. Jika opsi ini ditentukan, sed akan membuka file input dalam mode biner, sehingga tidak meminta pemrosesan khusus ini dan mempertimbangkan baris untuk diakhiri pada feed baris.`

Shlomo
sumber
5
Perhatikan bahwa ini tidak berfungsi sed -ipada cygwin (untuk saya), tetapi Anda dapat mengatasinya. Terima kasih atas pembaruannya - jawaban lain adalah kata terakhir tentang subjek ini untuk sementara waktu.
harpo
Perhatikan, opsi ini tidak tersedia dengan sed di Mac.
Senthil Kumaran
21
Berfungsi untuk saya bahkan dengan sed -i: yang penting adalah cara mengetiknya. While sed -biand sed -i -bwork, sed -ibdoes not work: lihat halaman manual untuk mengetahui alasannya (menggunakan bsebagai sufiks untuk salinan cadangan).
Olaf Mandel
2
Gunakan:sed -bi 's/foo/bar/'
Kunal B.
2
Tidak bekerja untuk saya di Windows cygwin. Pada garis yang membuat perubahan, ujung garis adalah Unixy. Garis lainnya memiliki akhiran garis Windowish. Jadi file saya mendapat campuran baris dengan akhiran baris yang berbeda.
truthadjustr
10

Anda dapat mencoba sub \nuntuk \r\ndi akhir skrip yang ada seperti ini:

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

atau mungkin

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

Jika tidak satu pun dari dua di atas berfungsi, Anda harus melihat halaman manual spesifik untuk versi Anda seduntuk melihat apakah opsi seperti itu ada. Perhatikan bahwa * versi nix dari sedyang tidak mengubah line terminator tanpa diberitahu untuk melakukannya.

Alternatif lain adalah menggunakan cygwinversi sedyang seharusnya tidak memiliki perilaku yang tidak diinginkan ini.

SiegeX
sumber
15
Versi cygwin memang memiliki perilaku yang tidak diinginkan ini.
harpo
2
Jika file berisi \ n ( 0x0A) dan \ r \ n ( 0x0D 0x0A) - solusi yang diusulkan ini (selalu menginjeksi ulang \ r) akan memecahnya.
Vlad
Ini berfungsi untuk saya menggunakan MSYS2 / MinGW. Terima kasih @SiegeX.
AntumDeluge
6

Atau, (versi cygwin dari) perl -petampaknya tidak mengalami masalah ini.

pencari
sumber
sed di MacOS tidak memiliki opsi -b dan memiliki masalah serupa seperti yang dijelaskan dalam pertanyaan awal. Alternatif perl tidak memiliki masalah ini, jadi terima kasih atas saran Anda. sed -i -e 's/<img[^>]*\/>//g' *.xmlmengganti akhiran baris dengan '\ n' perl -i -p -e 's/<img[^>]*\/>//g' *.xmlmempertahankan akhiran baris asli
Guruniverse
2

Gnuwin dapat ditekan untuk mengacaukan baris baru (win-> unix) jika Anda hanya menentukan sakelar -b dan redirect. Menggunakan sakelar -i (inline) akan mengacaukannya.

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

buckley
sumber
1
Lihat versi dengan -imode kerja di jawaban saya .
Vadzim
2

Saya telah menemukan bahwa sed-4.4.exedari https://github.com/mbuilov/sed-windows benar-benar menang

  • menggunakan akhiran baris CRLF windows dalam mode default
  • mempertahankan akhiran baris asli dalam -bmode
  • bekerja dengan benar dengan -imode di tempat
  • juga menawarkan -zmode dengan \0pembatas, bukan \nyang terkadang berguna juga

Lihat juga daftar opsi sed dan daftar semua port windows sed .

Perhatikan bahwa gnuwin32 sed 4.2.1 tidak merusak akhiran baris dalam -bimode dan tidak memiliki -zmode sama sekali.

Vadzim
sumber