แปลง CRLF's เป็นตัวดึงข้อมูลบรรทัดบน Linux


34

เป็นวิธีที่ดีที่สุดในการแปลงCRLFของบรรทัดฟีดในไฟล์บน Linux คืออะไร?

ฉันเคยเห็นคำสั่งที่ล่อลวงแต่มีอะไรที่ง่ายกว่านี้ไหม


4
ซ้ำ: superuser.com/questions/38744/… ลิงก์ที่ให้ไว้ในคำตอบที่ยอมรับนั้นครอบคลุมตัวเลือก dos2unix, perl และ vi
nagul

2
นี้มีคำตอบที่ดีแม้ว่า (ดังนั้นหากหนึ่งในจำนวนนี้คือการถูกปิดก็อาจจะที่หนึ่ง)
Jonik

คำตอบ:


40

ใช้คำสั่งนี้:

fromdos yourtextfile

วิธีอื่น ๆ :

todos yourtextfile

คำสั่งเหล่านี้พบได้ในแพ็คเกจtofrodos (บนดิสทริบิวชันล่าสุด) ซึ่งจัดเตรียมสองชุดunix2dosและdos2unixที่เลียนแบบเครื่องมือ unix เก่าที่มีชื่อเดียวกัน


2
+1 มีประโยชน์มากกว่าคำตอบ "ใช้ dos2unix" ที่ได้รับคะแนนสูงสุดในปัจจุบัน
Jonik

1
ใช่แม้ฉันจะลงคะแนนนี้ Mine เป็นคำแนะนำเพิ่มเติมจากการขับรถ
ไรอันซี ธ อมป์สัน

ฉันจะให้โบนัสพิเศษถ้าคุณบอกว่าจะทำซ้ำได้อย่างไร ปัจจุบันใช้งานได้เฉพาะกับสัญลักษณ์เสริม
sorin

2
@SorinSbarnea: บางสิ่งบางอย่างfind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre

@ Jonik ทำให้อะไร "มีประโยชน์มากขึ้น"? คำถามที่จริงจัง
andrewtweber

24

dos2unixใช้

dos2unix - ตัวแปลงรูปแบบไฟล์ข้อความ DOS / MAC เป็น UNIX

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]

2
และ unix2dos สำหรับรอบวิธีอื่น '
ต้มตุ๋น Quixote

ต้มตุ๋นคุณกำลังติดตามฉัน ไม่ใช่ว่าฉันไม่ชอบมันด้วย upvotes ทั้งหมด
ไรอันซี ธ อมป์สัน

1
เพื่อนฉันนักต้มตุ๋น ออกเสียง "~" เป็น "ไม่" :) แต่ไม่ใช่ไม่ได้ติดตามคุณเลยดูเหมือนว่าฉันจะเจอคุณบ่อยๆ
ต้มตุ๋น Quixote

1
พิจารณาอย่างละเอียดถึงวิธีการรับยูทิลิตี้นี้สำหรับระบบ Linux ของคุณ อย่างน้อยบน Ubuntu ก็ไม่ได้ติดตั้งตามค่าเริ่มต้น (แต่โดยการติดตั้งแพ็คเกจ tofrodos คุณจะได้รับสิ่งที่คล้ายกันมาก: packages.ubuntu.com/jaunty/tofrodos )
Jonik

20

ฉันชอบ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 ที่เสียเวลาหนึ่งชั่วโมงในการเขียนสิ่งนี้!


1
(การใช้งานที่ไร้ประโยชน์ของแมวและ) Perl คือเป็นความซับซ้อนเป็น sed ... ทำให้คุณไม่ได้จริงๆตอบคำถาม แต่การเก็บรวบรวมชื่อเสียง :)
akira

2
"วิธีที่ดีที่สุด" เป็นเรื่องส่วนตัว สิ่งนี้ทำงานได้ดีที่สุดสำหรับฉัน (ฉันรู้สึกสะดวกสบายกับ Perl มากกว่า sed) ฉันไม่ได้สัญญาว่ามันจะดีที่สุดสำหรับคุณ
ต้มตุ๋น Quixote

@akira: คำถามสามารถมีคำตอบที่ถูกต้องหลายข้อ ฉันใช้วิธีนี้เช่นกันบางครั้งส่วนใหญ่เมื่อรวมกับการเปลี่ยนแปลงอื่น ๆ ดังนั้นจึงเป็นคำตอบที่ถูกต้องแน่นอน แต่ "ใช้ dos2unix" เป็นคำตอบที่ใช้งานได้จริงในสถานการณ์ส่วนใหญ่ ดังนั้นฉันคิดว่าการให้คะแนนนั้นดี
reinierpost

@akira: ถ้าคุณคิดว่ามันง่ายกว่านี้โปรดโพสต์มันเพื่อเป็นคำตอบและให้ความกระจ่างแก่พวกเราที่เหลือ
ต้มตุ๋น Quixote

@ ~ quack: นั่นคือประเด็น: มันไม่ง่าย นั่นก็เหมือนกันสำหรับคำตอบ Perl ของคุณ u2d หรือ fromdos / todos เป็นคำตอบที่ถูกต้องเพราะมันง่ายกว่าสิ่งที่แสดงในภาษาการเขียนโปรแกรมอื่น ๆ
akira

9

ฉันทำสิ่งนี้กับBash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file

ดี ฉันเห็นการกล่าวถึง tr อีกครั้งในวันนี้ ไม่ใช่โปรแกรมที่ถูกกล่าวถึงบ่อยมากใช่ไหม
ต้มตุ๋น Quixote



4

ฉันพบวิธีที่ง่ายมาก ... เปิดไฟล์ด้วย 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 เพื่อออก


1
คุณสามารถแก้ไขคำตอบเพื่อชี้แจงการตั้งค่าสลับที่จะทำซ้ำพฤติกรรมที่ร้องขอโดย OP หรือไม่
Burgi

สหกรณ์ต้องการที่จะสลับออก DOS Alt+dตอนจบบรรทัดดังนั้น บางครั้ง alt ถูกขัดขวางโดยโปรแกรมเทอร์มินัลดังนั้นคุณสามารถใช้esc+dแทน
ปินอัพ

1
ปุ่มลัดนาโนจำนวนมากสามารถใช้งานร่วมกับปุ่ม Shift ซึ่งมักจะป้องกันการสกัดกั้นเทอร์มินัลดังนั้น 'Alt-Shift-D' ก็ทำงานเช่นกัน
mwfearnley

3

ฉันชอบที่เป็นกลุ่ม:set fileformat=unixและ แม้ว่าจะไม่ใช่วิธีที่เร็วที่สุด แต่ก็ให้ภาพตัวอย่างแก่ฉัน มันมีประโยชน์อย่างยิ่งในกรณีของไฟล์ที่มีตอนจบแบบผสม


1

หากคุณต้องการวิธีการแบบ GUI ให้ลองใช้ตัวแก้ไขข้อความKate (โปรแกรมแก้ไขข้อความขั้นสูงอื่น ๆ อาจรองรับวิธีนี้ได้เช่นกัน) เปิดหา / แทนที่โต้ตอบ ( Ctrl+ R) และแทนที่ด้วย\r\n \n(หมายเหตุ: คุณจะต้องเลือก "นิพจน์ปกติ" จากดรอปดาวน์และยกเลิกการเลือก "การเลือกเท่านั้น" จากตัวเลือก)

แก้ไข: หรือถ้าคุณเพียงต้องการที่จะแปลงเป็นรูปแบบ Unix แล้วใช้ตัวเลือกเมนูTools> >End of LineUnix


มีโปรแกรมแก้ไขข้อความเช่น jEdit ซึ่งสามารถทำการแปลงเหล่านี้ได้โดยอัตโนมัติ - คุณเพียงแค่บอกว่าคุณต้องการตัวแยกบรรทัด Unix, Windows หรือ Mac
Jonik

ที่จริง KATE สามารถทำเกินไปผ่านเครื่องมือ> จุดสิ้นสุดของเส้นเมนู บางทีฉันควรจะคิดในภายหลังมากกว่าตอบคำถามแบบตรงตามที่พูด - แต่ถ้าคุณรู้ว่าคุณต้องการแปลง\r\nเป็นพิเศษ\nโดยใช้การค้นหา / แทนที่นั้นง่ายกว่าการจดจำว่าระบบปฏิบัติการใดใช้การลงท้ายบรรทัดใด ;)
DisgruntledGoat

1

วางสิ่งนี้ลงในสคริปต์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 โดเมนสาธารณะ


1

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

0

ฉันใช้สคริปต์นี้สำหรับไฟล์ที่ฉันต้องการเพื่อถ่ายโอนไฟล์ฉุกเฉินจากระบบ 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

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