Satır sonlarını koru


111

Windows üzerinde bazı değişiklikler yapmak için sed çalıştırdım ve bunun satır sonlarını otomatik olarak Unix'e (\ n) dönüştürdüğünü fark ettim. Sed'e Windows satır sonlarını (\ r \ n) kullanmasını veya dosyadaki satır sonlarını korumasını söyleme seçeneği var mı?

Not: unxutils'ten sed kullanıyorum: http://unxutils.sourceforge.net/


2
Aşağıdaki çözümler macOS'ta çalışmaz.
William Entriken

Bu kadar uzağa bile gittim ve hala işe yaramadıLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken

Yani aslında yukarıdaki komut çalışıyor ve git diffprogramda bir hata keşfettim .
William Entriken

1
Sed (herhangi bir özel seçenek olmadan) + unix2dos kullanabilirsiniz
mems

Yanıtlar:


143

-bDosyayı ikili olarak işlemesi için sed seçeneğini kullanabilirsiniz . Bu, cygwin'in Windows'taki sed'indeki sorunu çözecektir.

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

Satırın sonunu eşleştirmek isterseniz, isteğe bağlı satırbaşı ile eşleşmeyi, yakalamayı ve kopyalamayı unutmayın.

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

Gönderen sed adam sayfası :

-b - ikili

Bu seçenek her platformda mevcuttur, ancak yalnızca işletim sisteminin metin dosyaları ile ikili dosyalar arasında bir ayrım yaptığı durumlarda etkilidir. Böyle bir ayrım yapıldığında - MS-DOS, Windows, Cygwin'de olduğu gibi - metin dosyaları satır başı ve satır besleme karakteriyle ayrılmış satırlardan oluşur ve sed biten CR'yi görmez. Bu seçenek belirtildiğinde, sed girdi dosyalarını ikili kipte açar, bu nedenle bu özel işlemi talep etmez ve satırların bir satır beslemesinde bitmesini dikkate almaz. '


5
Bunun sed -icygwin'de (benim için) işe yaramadığını unutmayın, ancak bunun etrafında çalışabilirsiniz. Güncelleme için teşekkürler - diğer cevaplar bir süredir bu konudaki son sözlerdi.
harpo

Bu seçeneğin Mac'te sed ile kullanılamadığını unutmayın.
Senthil Kumaran

21
Benim için bile sed -iişe yarar: nasıl yazılacağı önemlidir. İken sed -bive sed -i -biş, sed -ibdoes not (kullanmaktadır neden man sayfasına bakın: Binaların byedek kopyası için son eki gibi).
Olaf Mandel

2
Kullanın:sed -bi 's/foo/bar/'
Kunal B.

2
Windows cygwin'de benim için çalışmıyor. Değişikliği yapan hatlarda, satır sonları Unixy'dir. Kalan satırlarda Windowish satır sonları vardır. Böylece dosyam farklı satır sonlarına sahip karışık satırlar aldı.
truthadjustr

10

Mevcut betiğinizin sonundaki \niçin \r\nşu şekilde yazmayı deneyebilirsiniz :

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

ya da belki

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

Yukarıdaki ikisinin hiçbiri işe yaramazsa, sedböyle bir seçeneğin mevcut olup olmadığını görmek için sürümünüzün man sayfasına bakmanız gerekir . Not * nix versiyonları olduğunu seddo not olmadan hat sonlandırıcılarını değiştirmek bunu söylenmişti.

Başka bir alternatif kullanmaktır cygwinsürümünü sedhangi olmamalıdır bu istenmeyen davranışa sahip.


15
Cygwin versiyonu bu istenmeyen davranışa sahiptir.
harpo

2
Dosya hem \ n ( 0x0A) hem de \ r \ n ( 0x0D 0x0A) içeriyorsa - önerilen bu çözüm (her zaman \ r'yi yeniden enjekte ederek) onu bozar.
Vlad

Bu benim için MSYS2 / MinGW kullanarak çalışıyor. Teşekkür ederim @SiegeX.
AntumDeluge

6

Alternatif olarak, (Cygwin sürümü) perl -pebu soruna sahip görünmüyor.


sed MacOS'ta -b seçeneğine sahip değildir ve orijinal soruda anlatılana benzer sorunları vardır. Perl alternatifinde bu sorun yok, bu yüzden öneriniz için teşekkürler. sed -i -e 's/<img[^>]*\/>//g' *.xmlsatır sonlarını '\ n' perl -i -p -e 's/<img[^>]*\/>//g' *.xmlile değiştirir orijinal satır sonlarını korur
Guruniverse

2

Gnuwin, yalnızca -b anahtarını ve yeniden yönlendirmeyi belirtirseniz satırsonu satırlarını (win-> unix) karıştırmak için bastırılabilir. -İ (satır içi) anahtarını kullanmak her şeyi bozacaktır.

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


1
Çalışma ile bir sürüm bakın -imodunda Cevabıma .
Vadzim

2

Ben fark ettik sed-4.4.exedan https://github.com/mbuilov/sed-windows bunun saf kazançtır

  • varsayılan modda Windows CRLF satır sonlarını kullanır
  • orijinal satır sonları koruyan -bmod
  • yerinde -imod ile düzgün çalışır
  • Ayrıca sunmaktadır -zile modu \0delimeters yerine \nhangi bazen kullanışlı olabilir de

Ayrıca bkz sed seçeneklerin listesini ve bağlantı noktaları sed tüm pencereleri listesinde .

Not o GnuWin32 4.2.1 sed yapar bozuk satır sonları içinde -bimod ve yok -zhiç modunu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.