วิธีลบ Ctrl-M จากไฟล์ที่ไม่มี dos2unix, perl, tr และ sed อยู่?


9

สมมติว่าคุณกำลังทำงานบนเซิร์ฟเวอร์ยูนิกซ์เก่ามากที่dos2unix, perl, trและsedไม่ได้อยู่ คุณจะแปลงไฟล์จากdosเป็นฟอร์แมตยูนิกซ์ได้อย่างไร?


ได้รับอนุญาต
— elmarco

@elmarco: ไม่ :(
— Hemant

9
เซิร์ฟเวอร์ยูนิกซ์ต้องมีอายุเท่าไรtrและsedไม่ sedเก่า ........ iirc,
— xenoterracide

1
จะexหรือedมีอยู่ในระบบเช่นนั้นหรือไม่? ผมเรียกมันว่า would'nt ยูนิกซ์ถ้าไม่มีหรือtr sed
— MattBianco

3
ไม่มีsed? จริงๆ!? จากความสนใจระบบคืออะไร? ตามที่ Gilles และ MattBianco ชี้ให้เห็นก็อาจจะยังคงมีedอย่างน้อย
— Mikel

คำตอบ:


12

ฉันคิดว่าคุณกำลังหมายถึงการลบ caret-M ในตอนท้ายของบรรทัด คุณสามารถใช้การค้นหาและแทนที่ใน vi เพื่อทำสิ่งนี้

ใน vi ฉันปกติแล้ว: (โดยที่ "^" หมายถึง CTRL):

:%s/^V^M//g

ซึ่งแสดงบนหน้าจอเป็น:

:%s/^M//g

ขอบคุณที่ทำงาน :) ฉันคิดว่ามันเป็นโซลูชั่นแบบพกพามาก
— Hemant

4
คุณยังสามารถใช้ sed เพื่อทำสิ่งเดียวกันโดยไม่ต้องเรียกใช้ไฟล์: sed -e '% s / ^ V ^ M // g' ชื่อไฟล์ที่จะแสดงบนหน้าจอเป็น sed e '% s / ^ ชื่อไฟล์ M // g 'โดยทั่วไปถ้าคุณสามารถค้นหา / แทนที่มันในกลุ่มคำสั่งได้เหมือนกันใน sed
— เกบ

2
@gabe: ทางออก sed เป็นจริงแม้จะพกพามากขึ้น +1 :)
— wzzrd

@wzzrd sedและviทั้งคู่ถูกระบุโดย POSIXและviคำสั่งนั้นไม่ได้ใช้ส่วนขยาย Vim ใด ๆ
— Wildcard

@jjclarkson คำว่าอะไร^Vและ '^ M' หมายถึงอะไร
— cokeude

6

เซิร์ฟเวอร์ที่ไม่มีtrหรือsedจะต้องเก่าจริงๆหรือขาดคำสั่งพื้นฐานบางอย่าง หวังว่าedจะมี; มันมีอยู่ในระบบปฏิบัติการยูนิกซ์ฉบับพิมพ์ครั้งแรก

ed /path/to/file
1,$s/^V^M$//
w
q

โดยที่^V^Mพิมพ์Ctrl+ Vแล้วCtrl+ M(เพื่อป้อนตัวอักษรบรรทัด) หากคุณรู้ว่าทุกบรรทัดจบลงใน CR LF คุณสามารถใช้1,$s/.$//แทน (ลบตัวอักษรสุดท้ายในแต่ละบรรทัดโดยไม่เลือก)

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