เป็นวิธีที่ดีที่สุดในการแปลงCRLFของบรรทัดฟีดในไฟล์บน Linux คืออะไร?
ฉันเคยเห็นคำสั่งที่ล่อลวงแต่มีอะไรที่ง่ายกว่านี้ไหม
เป็นวิธีที่ดีที่สุดในการแปลงCRLFของบรรทัดฟีดในไฟล์บน Linux คืออะไร?
ฉันเคยเห็นคำสั่งที่ล่อลวงแต่มีอะไรที่ง่ายกว่านี้ไหม
คำตอบ:
ใช้คำสั่งนี้:
fromdos yourtextfile
วิธีอื่น ๆ :
todos yourtextfile
คำสั่งเหล่านี้พบได้ในแพ็คเกจtofrodos (บนดิสทริบิวชันล่าสุด) ซึ่งจัดเตรียมสองชุดunix2dosและdos2unixที่เลียนแบบเครื่องมือ unix เก่าที่มีชื่อเดียวกัน
find . -name '*.txt' -print0 | xargs -null fromdos
dos2unix
ใช้
dos2unix - ตัวแปลงรูปแบบไฟล์ข้อความ DOS / MAC เป็น UNIX
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
ฉันชอบPerl :
perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
แต่มันก็เหมาะกับการใช้งานของฉันและมันง่ายมากสำหรับฉันที่จะจำ ไม่ใช่ว่าทุกระบบจะมีคำสั่ง dos2unix แต่ส่วนใหญ่ที่ฉันทำงานนั้นมีล่าม perl
อีกอันคือrecodeการแทนที่ที่มีประสิทธิภาพสำหรับ dos2unix และ iconv มันมีอยู่ในแพคเกจ "recode" ในที่เก็บ Debian:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
สำหรับแฟน ๆawk :
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
... และsed :
sed 's/\r$//' winfile.txt > unixfile.txt
และตอนนี้เพียงน้อยกว่าที่ซับซ้อนน้อยกว่าการลบ CR ด้วยมือใน hex editor ตรงจากเพื่อนของ stackoverflow.com ของเราใช้กับinterpreter เนื้อ (อยู่ในพื้นที่เก็บข้อมูล Debian ที่เป็นมิตรของคุณ)
dos2unix ในbrainfuck !
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
ขอบคุณมากสำหรับ JK ที่เสียเวลาหนึ่งชั่วโมงในการเขียนสิ่งนี้!
ฉันทำสิ่งนี้กับBash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
ฉันคิดว่าคุณสามารถใช้tr
เช่นกัน (แม้ว่าฉันจะไม่มีไฟล์รูปแบบตลก ๆ ที่ต้องลอง):
tr -d '\r' < file1 > file2
ใน vi หรือVim :
:%s/^V^M//g
ฉันพบวิธีที่ง่ายมาก ... เปิดไฟล์ด้วย nano: ## nano file.txt
กด Ctrl + O เพื่อบันทึก แต่ก่อนกด Enter กด: Alt + D เพื่อสลับระหว่าง DOS และ Unix / Linux line-endings หรือ: Alt + M เพื่อสลับ betwen Mac และ Unix / Linux line-endings จากนั้นกด Enter เพื่อบันทึกและ Ctrl + X เพื่อออก
Alt+d
ตอนจบบรรทัดดังนั้น บางครั้ง alt ถูกขัดขวางโดยโปรแกรมเทอร์มินัลดังนั้นคุณสามารถใช้esc+d
แทน
ฉันชอบที่เป็นกลุ่ม:set fileformat=unix
และ แม้ว่าจะไม่ใช่วิธีที่เร็วที่สุด แต่ก็ให้ภาพตัวอย่างแก่ฉัน มันมีประโยชน์อย่างยิ่งในกรณีของไฟล์ที่มีตอนจบแบบผสม
หากคุณต้องการวิธีการแบบ GUI ให้ลองใช้ตัวแก้ไขข้อความKate (โปรแกรมแก้ไขข้อความขั้นสูงอื่น ๆ อาจรองรับวิธีนี้ได้เช่นกัน) เปิดหา / แทนที่โต้ตอบ ( Ctrl+ R) และแทนที่ด้วย\r\n
\n
(หมายเหตุ: คุณจะต้องเลือก "นิพจน์ปกติ" จากดรอปดาวน์และยกเลิกการเลือก "การเลือกเท่านั้น" จากตัวเลือก)
แก้ไข: หรือถ้าคุณเพียงต้องการที่จะแปลงเป็นรูปแบบ Unix แล้วใช้ตัวเลือกเมนูTools
> >End of Line
Unix
\r\n
เป็นพิเศษ\n
โดยใช้การค้นหา / แทนที่นั้นง่ายกว่าการจดจำว่าระบบปฏิบัติการใดใช้การลงท้ายบรรทัดใด ;)
วางสิ่งนี้ลงในสคริปต์dos2unix.py Python
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
ควรทำงานบนแพลตฟอร์มใด ๆ ที่ติดตั้ง Python โดเมนสาธารณะ
CR LF
การLF
ใช้awk :
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
ตัวอย่างการใช้งาน:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
คำอธิบาย:
-v RS='\r?\n'
ตั้งค่าตัวแปร RS ( อินพุต r ecord s eparator) เป็น\r?\n
ความหมายอินพุตถูกอ่านทีละบรรทัดโดยคั่นด้วย LF ( \n
) ซึ่งอาจ ( ?
) นำหน้าด้วย CR ( \r
)
1
เป็นสคริปต์ awk รัน condition { action }
สคริปต์ประกอบด้วย ในกรณีนี้1
เป็นเงื่อนไขที่ประเมินว่าเป็นจริง การดำเนินการถูกละเว้นดังนั้นการดำเนินการเริ่มต้นจะถูกดำเนินการซึ่งหมายความว่าพิมพ์บรรทัดปัจจุบัน (ซึ่งสามารถเขียนเป็น{print $0}
หรือเพียงแค่{print}
)
LF
ถึงCR LF
: คุณสามารถตั้งค่าตัวแปรORS
( o utput r ecord s eparator) เพื่อแก้ไขบรรทัดสิ้นสุดของเอาต์พุต ตัวอย่าง:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
ฉันใช้สคริปต์นี้สำหรับไฟล์ที่ฉันต้องการเพื่อถ่ายโอนไฟล์ฉุกเฉินจากระบบ windows ไปยังระบบ unix
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
ค้นหาไฟล์ทั้งหมดซ้ำในไดเรกทอรีที่คุณเรียกใช้คำสั่ง
xargs file
ส่งต่อไปยังโปรแกรมไฟล์เพื่อรับการวิเคราะห์ไฟล์
grep CRLF
เราต้องการเฉพาะเอาต์พุตของไฟล์ที่แสดง CRLF
cut -d: -f1
รับเอาต์พุตสูงสุดตามสี ทิ้งส่วนที่เหลือ ตอนนี้เราควรมีชื่อไฟล์เท่านั้น
xargs dos2unix
ผ่านชื่อไฟล์ไปยังโปรแกรมdos2unixใช้xargs