รักษาการสิ้นสุดบรรทัด


111

ฉันเรียกใช้ sed เพื่อทำการแทนที่บน windows และฉันสังเกตเห็นว่ามันจะแปลงส่วนท้ายบรรทัดเป็น Unix (\ n) โดยอัตโนมัติ มีตัวเลือกที่จะบอกให้ sed ใช้การสิ้นสุดบรรทัดของ Windows (\ r \ n) หรือดีกว่าเพื่อรักษาส่วนท้ายบรรทัดจากไฟล์หรือไม่

หมายเหตุ: ฉันใช้ sed จาก unxutils: http://unxutils.sourceforge.net/


2
วิธีแก้ปัญหาด้านล่างใช้ไม่ได้กับ macOS
William Entriken

ฉันมาไกลขนาดนี้แล้ว แต่ก็ยังใช้ไม่ได้LC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken

ดังนั้นคำสั่งด้านบนใช้งานได้จริงและฉันเพิ่งค้นพบจุดบกพร่องในgit diffโปรแกรม
William Entriken

1
คุณสามารถใช้ sed (ไม่มีตัวเลือกพิเศษ) + unix2dos

คำตอบ:


143

คุณสามารถใช้-bตัวเลือกสำหรับ sed เพื่อให้มันถือว่าไฟล์เป็นไบนารี สิ่งนี้จะแก้ไขปัญหาเกี่ยวกับ sed ของ cygwin บน Windows

ตัวอย่าง: sed -b 's/foo/bar/'

หากคุณต้องการจับคู่ส่วนท้ายของบรรทัดอย่าลืมจับคู่จับและคัดลอกการกลับแคร่ที่เป็นทางเลือก

ตัวอย่าง: sed -b 's/foo\(\r\?\)$/bar\1/'

จากหน้าsed man :

-b - ไบนารี

ตัวเลือกนี้พร้อมใช้งานในทุกแพลตฟอร์ม แต่จะมีผลเฉพาะเมื่อระบบปฏิบัติการสร้างความแตกต่างระหว่างไฟล์ข้อความและไฟล์ไบนารี เมื่อมีการสร้างความแตกต่างเช่นเดียวกับกรณีของ MS-DOS, Windows, Cygwin - ไฟล์ข้อความประกอบด้วยบรรทัดที่คั่นด้วยการส่งคืนแคร่และอักขระป้อนบรรทัดและ sed จะไม่เห็น CR ที่สิ้นสุด เมื่อระบุอ็อพชันนี้ sed จะเปิดไฟล์อินพุตในโหมดไบนารีดังนั้นจึงไม่ร้องขอการประมวลผลพิเศษนี้และพิจารณาบรรทัดที่สิ้นสุดที่ฟีดบรรทัด


5
โปรดทราบว่าสิ่งนี้ใช้ไม่ได้กับsed -icygwin (สำหรับฉัน) แต่คุณสามารถแก้ไขได้ ขอบคุณสำหรับการอัปเดตคำตอบอื่น ๆ เป็นคำสุดท้ายของเรื่องนี้มาระยะหนึ่งแล้ว
harpo

หมายเหตุตัวเลือกนี้ไม่สามารถใช้ได้กับ sed บน Mac
Senthil Kumaran

21
ใช้ได้ผลกับฉันด้วยsed -i: มันสำคัญแค่ว่าต้องพิมพ์อย่างไร ในขณะที่sed -biและsed -i -bทำงานsed -ibไม่ได้ทำงาน: เห็นหน้าคนว่าทำไม (ใช้bเป็นคำต่อท้ายสำหรับสำเนาสำรอง)
Olaf Mandel

2
ใช้:sed -bi 's/foo/bar/'
Kunal B.

2
ไม่ทำงานสำหรับฉันใน Windows cygwin ในบรรทัดที่ทำให้เกิดการเปลี่ยนแปลงปลายบรรทัดคือ Unixy บรรทัดที่เหลือมีการลงท้ายบรรทัดแบบ Windowish ดังนั้นไฟล์ของฉันจึงมีหลายบรรทัดที่มีส่วนท้ายบรรทัดต่างกัน
truthadjustr

10

คุณสามารถลองย่อย\nสำหรับ\r\nในตอนท้ายของสคริปต์ที่มีอยู่ของคุณดังนี้:

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

หรือบางที

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

หากทั้งสองข้อข้างต้นไม่ได้ผลคุณจะต้องปรึกษาหน้าคนเฉพาะสำหรับเวอร์ชันของคุณsedเพื่อดูว่ามีตัวเลือกดังกล่าวหรือไม่ โปรดทราบว่า * รุ่นระวังของsedไม่ได้เปลี่ยนจุดสิ้นสุดเส้นโดยไม่ต้องบอกว่าจะทำเช่นนั้น

อีกทางเลือกหนึ่งคือการใช้cygwinเวอร์ชันsedที่ไม่ควรมีพฤติกรรมที่ไม่พึงปรารถนานี้


15
เวอร์ชัน cygwin มีพฤติกรรมที่ไม่พึงปรารถนานี้
harpo

2
หากไฟล์มีทั้ง \ n ( 0x0A) และ \ r \ n ( 0x0D 0x0A) - โซลูชั่นที่นำเสนอนี้ (เสมออีกครั้งฉีด \ r) แบ่งมัน
Vlad

สิ่งนี้ใช้ได้กับฉันโดยใช้ MSYS2 / MinGW ขอบคุณ @SiegeX
AntumDeluge

6

หรืออีกทางหนึ่ง (เวอร์ชัน cygwin ของ) perl -peดูเหมือนจะไม่มีปัญหานี้


sed บน MacOS ไม่มีตัวเลือก -b และมีปัญหาที่คล้ายกันตามที่อธิบายไว้ในคำถามเดิม ทางเลือก perl ไม่มีปัญหานี้ดังนั้นขอขอบคุณสำหรับคำแนะนำของคุณ sed -i -e 's/<img[^>]*\/>//g' *.xmlแทนที่การสิ้นสุดบรรทัดโดย '\ n' perl -i -p -e 's/<img[^>]*\/>//g' *.xmlคงการสิ้นสุดบรรทัดเดิมไว้
Guruniverse

2

คุณสามารถระงับ Gnuwin เพื่อทำให้การขึ้นบรรทัดใหม่ (win-> unix) ยุ่งเหยิงหากคุณระบุเฉพาะสวิตช์ -b และเปลี่ยนเส้นทาง การใช้สวิตช์ -i (อินไลน์) จะทำให้สับสน

เช่น sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv


1
ดูรุ่นที่มีการทำงาน-iในโหมดคำตอบของฉัน
Vadzim

2

ฉันพบว่าsed-4.4.exeจากhttps://github.com/mbuilov/sed-windowsเป็นการชนะที่แท้จริง

  • ใช้การลงท้ายบรรทัด CRLF ของ windows ในโหมดเริ่มต้น
  • รักษาการสิ้นสุดบรรทัดเดิมใน-bโหมด
  • ทำงานได้อย่างถูกต้องใน-iโหมดin-place
  • ยังมี-zโหมดที่มี\0เส้นคั่นแทน\nซึ่งบางครั้งอาจมีประโยชน์เช่นกัน

ดูรายการตัวเลือก sedและรายการพอร์ต windows sedทั้งหมด

โปรดทราบว่าgnuwin32 sed 4.2.1ทำให้การสิ้นสุดบรรทัดเสียหายใน-biโหมดและไม่มี-zโหมดเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.