วิธีการแปลง DOS / Windows newline (CRLF) เป็น Unix newline (LF) ใน Bash script?


336

ฉันจะตั้งโปรแกรมขึ้นviบรรทัดใหม่ของ DOS / Windows เป็น Unix โดยทางโปรแกรมได้อย่างไร(เช่นไม่ใช้)

dos2unixและunix2dosคำสั่งที่ไม่สามารถใช้ได้ในบางระบบ ฉันจะเลียนแบบสิ่งเหล่านี้ด้วยคำสั่งเช่นsed/ awk/ ได้trอย่างไร


9
โดยทั่วไปเพียงแค่ติดตั้งdos2unixโดยใช้ตัวจัดการแพคเกจของคุณจริงๆแล้วมันง่ายกว่ามาก
แบรดโคช์

1
ตกลงกัน! @BradKoch Simple as 'brew install dos2unix' บน Mac OSX
SmileIT

คำตอบ:


322

คุณสามารถใช้trเพื่อแปลงจาก DOS เป็น Unix; อย่างไรก็ตามคุณสามารถทำได้อย่างปลอดภัยหาก CR ปรากฏในไฟล์ของคุณเป็นไบต์แรกของคู่ไบต์ CRLF เท่านั้น โดยปกติจะเป็นกรณี. จากนั้นคุณใช้:

tr -d '\015' <DOS-file >UNIX-file

โปรดทราบว่าชื่อDOS-fileจะแตกต่างจากชื่อUNIX-file; หากคุณพยายามใช้ชื่อเดียวกันสองครั้งคุณจะพบว่าไม่มีข้อมูลในไฟล์

คุณไม่สามารถทำได้อีกทางหนึ่ง (ด้วยมาตรฐาน 'tr')

ถ้าคุณรู้ว่าวิธีการป้อนกลับรถเข้าไปในสคริปต์ ( control-V, control-Mจะเข้าสู่การควบคุม-M) แล้ว:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

โดยที่ '^ M' เป็นตัวควบคุม -M คุณยังสามารถใช้กลไกการbash อ้างอิง ANSI-Cเพื่อระบุการขึ้นบรรทัดใหม่:

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

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

หากคุณต้องการประมวลผลทั้งไดเรกทอรีและไดเรกทอรีย่อยคุณสามารถใช้zip:

zip -r -ll zipfile.zip somedir/
unzip zipfile.zip

สิ่งนี้จะสร้างไฟล์เก็บถาวรซิปที่มีการสิ้นสุดบรรทัดเปลี่ยนจาก CRLF เป็น CR unzipจากนั้นจะวางไฟล์ที่แปลงแล้วกลับเข้าที่ (และขอให้คุณส่งไฟล์เป็นไฟล์ - คุณสามารถตอบ: ใช่ไปทั้งหมด) เครดิตให้กับ @vmsnomad สำหรับการชี้เรื่องนี้


9
การใช้tr -d '\015' <DOS-file >UNIX-filewhere DOS-file== UNIX-fileเพียงส่งผลให้ไฟล์ว่างเปล่า ไฟล์ที่ส่งออกจะต้องเป็นไฟล์อื่นโชคไม่ดี
Buttle Butkus

3
@ButtleButkus: ใช่แล้ว นั่นเป็นเหตุผลที่ฉันใช้ชื่อต่างกันสองชื่อ หากคุณ zap ไฟล์อินพุตก่อนที่โปรแกรมจะอ่านมันทั้งหมดเช่นเดียวกับเมื่อคุณใช้ชื่อเดียวกันสองครั้งคุณจะจบด้วยไฟล์เปล่า นั่นเป็นพฤติกรรมที่เหมือนกันในระบบ Unix มันต้องใช้รหัสพิเศษในการจัดการการเขียนทับไฟล์อินพุตอย่างปลอดภัย ทำตามคำแนะนำและคุณจะตกลง
Jonathan Leffler

ฉันดูเหมือนจะจำฟังก์ชั่นการค้นหาแทนที่ไฟล์ในบางที่
Buttle Butkus

4
มีสถานที่; คุณต้องรู้ว่าจะหาพวกเขาได้ที่ไหน ภายในขีด จำกัดsedตัวเลือกGNU -i(สำหรับใช้ในสถานที่) ทำงานได้ ข้อ จำกัด คือไฟล์ที่เชื่อมโยงและ symlink sortคำสั่งมี 'เสมอ' (ตั้งแต่ปี 1979 หากไม่ได้ก่อนหน้านี้) สนับสนุน-oตัวเลือกซึ่งสามารถแสดงรายการหนึ่งแฟ้มใส่ อย่างไรก็ตามนั่นเป็นส่วนหนึ่งเพราะsortต้องอ่านอินพุตทั้งหมดก่อนจึงจะสามารถเขียนเอาต์พุตใด ๆ ได้ โปรแกรมอื่น ๆ สนับสนุนการเขียนทับไฟล์อินพุตอย่างใดอย่างหนึ่งเป็นระยะ คุณสามารถค้นหาโปรแกรมวัตถุประสงค์ทั่วไป (สคริปต์) เพื่อหลีกเลี่ยงปัญหาใน'The UNIX Programming Environment'โดย Kernighan & Pike
Jonathan Leffler

3
ตัวเลือกที่สามใช้งานได้สำหรับฉันขอบคุณ ฉันใช้ตัวเลือก -i: sed -i $'s/\r$//' filename- เพื่อแก้ไข ฉันกำลังทำงานกับเครื่องที่ไม่สามารถเข้าถึงอินเทอร์เน็ตดังนั้นการติดตั้งซอฟต์แวร์จึงเป็นปัญหา
Warren Dew

64
tr -d "\r" < file

ลองดูตัวอย่างที่นี่โดยใช้sed:

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'               # assumes that all lines end with CR/LF
sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"            # command line under ksh
sed 's/$'"/`echo \\\r`/"             # command line under bash
sed "s/$/`echo \\\r`/"               # command line under zsh
sed 's/$/\r/'                        # gsed 3.02.80 or higher

ใช้สำหรับในสถานที่เช่นการแปลงsed -ised -i 's/..../' file


10
ฉันใช้ตัวแปรตั้งแต่ไฟล์ของฉันมี\r:tr "\r" "\n" < infile > outfile
Matt Todd

1
@MattTodd คุณสามารถโพสต์สิ่งนี้เป็นคำตอบได้หรือไม่? -dเป็นจุดเด่นบ่อยขึ้นและจะไม่ช่วยใน "เท่านั้น\r" สถานการณ์
n611x007

5
โปรดทราบว่าการทำแผนที่ที่เสนอ\rให้\nมีผลต่อการเว้นวรรคสองไฟล์; แต่ละบรรทัด CRLF ที่ลงท้ายด้วย DOS จะกลายเป็น\n\nUnix
Jonathan Leffler

ฉันสามารถทำซ้ำได้หรือไม่?
Aaron Franke

36

การทำสิ่งนี้กับ POSIX นั้นยุ่งยาก:

  • POSIX Sedไม่สนับสนุนหรือ\r \15แม้ว่าจะเป็นเช่นนั้นตัวเลือก in place -iไม่ใช่ POSIX

  • POSIX Awkรองรับ\rและ\15อย่างไรก็ตาม-i inplaceตัวเลือกนี้ไม่ได้เป็น POSIX

  • d2uและdos2unixไม่ใช่POSIX ยูทิลิตี้แต่อดีตคือ

  • POSIX อดีตไม่สนับสนุน\r, \15, \nหรือ\12

หากต้องการลบ carriage return ให้ทำดังนี้

ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file

ในการเพิ่มการขึ้นบรรทัดใหม่ให้ทำดังนี้

ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file

2
ดูเหมือนว่าPOSIX สนับสนุนtr \r ดังนั้นคุณสามารถใช้printf '%s\n' '%!tr -d "\r"' x | ex file(แม้ว่าจะได้รับสิ่งนี้\rจะถูกลบออกแม้ว่าจะไม่ได้นำหน้าทันที\n) นอกจากนี้-bตัวเลือกที่exจะไม่ถูกระบุโดย POSIX
Wildcard

1
การทำสิ่งนี้ใน POSIX นั้นง่ายมาก ฝังตัวอักษร CR ในสคริปต์โดยพิมพ์ (เป็น control-M)
Joshua

28

คุณสามารถใช้ vim โดยทางโปรแกรมพร้อมกับอ็อพชัน -c {command}:

Dos เป็น Unix:

vim file.txt -c "set ff=unix" -c ":wq"

Unix to dos:

vim file.txt -c "set ff=dos" -c ":wq"

"set ff = unix / dos" หมายถึงเปลี่ยน fileformat (ff) ของไฟล์เป็น Unix / DOS ในรูปแบบบรรทัด

": wq" หมายถึงเขียนไฟล์ลงดิสก์และออกจากโปรแกรมแก้ไข (อนุญาตให้ใช้คำสั่งในลูป)


3
ดูเหมือนว่านี่จะเป็นทางออกที่ดีที่สุด แต่การขาดคำอธิบายเกี่ยวกับสิ่งที่ wq หมายถึงเป็นสิ่งที่โชคร้าย
Jorrick Sleijster

5
ทุกคนที่ใช้viจะรู้ว่าสิ่งที่:wqหมายถึง สำหรับผู้ที่ไม่มี 3 ตัวอักษรหมายถึง 1) พื้นที่คำสั่งเปิด vi, 2) เขียนและ 3) ออกจาก
David Newcomb

ฉันไม่รู้ว่าคุณสามารถเพิ่มคำสั่งแบบโต้ตอบเพื่อเรียกร้องจาก CLI ได้
Robert Dundon

คุณสามารถใช้ ": x" แทน ": wq"
JosephConrad

25

การใช้ AWK คุณสามารถทำได้:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

การใช้ Perl คุณสามารถทำได้:

perl -pe 's/\r$//' < dos.txt > unix.txt

2
ทางออกที่ดีพกพา awkสะดวก
mklement0

23

เพื่อแปลงไฟล์ในสถานที่ใช้งาน

dos2unix <filename>

เมื่อต้องการส่งออกข้อความที่แปลงเป็นไฟล์อื่นให้ใช้

dos2unix -n <input-file> <output-file>

คุณสามารถติดตั้งบน Ubuntu หรือ Debian ด้วย

sudo apt install dos2unix

หรือบน macOS โดยใช้homebrew

brew install dos2unix

1
ฉันรู้ว่าคำถามถามหาทางเลือกในการ dos2unix แต่มันเป็นผล google แรก
บอริส

18

ปัญหานี้สามารถแก้ไขได้ด้วยเครื่องมือมาตรฐาน แต่มีเพียงพอกับดักมากมายสำหรับเลินเล่อที่ผมขอแนะนำให้คุณติดตั้งflipคำสั่งที่ถูกเขียนขึ้นในช่วง 20 ปีที่ผ่านมาโดยราหุล Dhesi, zooผู้เขียนของ มันทำงานได้อย่างยอดเยี่ยมในการแปลงรูปแบบไฟล์ในขณะที่หลีกเลี่ยงการทำลายไฟล์ไบนารี่โดยไม่ได้ตั้งใจซึ่งเป็นเรื่องง่ายเกินไปถ้าคุณแค่เปลี่ยนไปเปลี่ยน CRLF ทุกอันที่คุณเห็น ...


มีวิธีใดบ้างในการสตรีมโดยไม่ต้องแก้ไขไฟล์ต้นฉบับ
augurar

@augurar คุณสามารถตรวจสอบ "แพคเกจที่คล้ายกัน" packages.debian.org/wheezy/flip
n611x007

ฉันมีประสบการณ์ในการทำลายระบบปฏิบัติการเพียงครึ่งเดียวโดยเรียกใช้ texxto ด้วยการตั้งค่าสถานะผิด ระวังโดยเฉพาะอย่างยิ่งถ้าคุณต้องการที่จะทำมันในโฟลเดอร์ทั้งหมด
A_P

14

การแก้ปัญหาที่โพสต์นั้นจัดการกับปัญหาเพียงบางส่วนโดยแปลง CRLF ของ DOS / Windows ให้เป็น LF ของ Unix ส่วนหนึ่งที่พวกเขากำลังขาดหายไปคือว่าการใช้ CRLF DOS เป็นเส้นคั่นในขณะที่ระบบปฏิบัติการยูนิกซ์ใช้ LF เป็นเส้นTerminator ข้อแตกต่างคือไฟล์ DOS (ปกติ) จะไม่มีอะไรหลังจากบรรทัดสุดท้ายในไฟล์ในขณะที่ Unix จะ ในการแปลงให้ถูกต้องคุณต้องเพิ่ม LF สุดท้ายนั้น (เว้นแต่ไฟล์จะมีความยาวเป็นศูนย์นั่นคือไม่มีบรรทัดเลย) คาถาที่ฉันโปรดปรานสำหรับสิ่งนี้ (ด้วยตรรกะเล็กน้อยที่เพิ่มเข้ามาเพื่อจัดการไฟล์ที่คั่นด้วย CR สไตล์ Mac และไม่ใช่ไฟล์ที่เป็นอันตรายที่อยู่ในรูปแบบ unix อยู่แล้ว) เป็นบิตของ perl:

perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt

โปรดทราบว่าสิ่งนี้จะส่งเวอร์ชัน Unixified ของไฟล์ไปยัง stdout หากคุณต้องการแทนที่ไฟล์ด้วยเวอร์ชัน Unixified ให้เพิ่มการ-iตั้งค่าสถานะของ perl


@LudovicZenohateLagouardette มันเป็นไฟล์ข้อความธรรมดา (เช่น csv หรือ text-tab-demited text) หรืออย่างอื่น? ถ้ามันอยู่ในรูปแบบฐานข้อมูลบางอย่างให้จัดการมันราวกับว่ามันเป็นข้อความมีความเป็นไปได้สูงที่จะทำให้โครงสร้างภายในเสียหาย
Gordon Davisson

ข้อความธรรมดา csv แต่ฉันคิดว่าการเข้ารหัสนั้นแปลก ฉันคิดว่ามันเกิดความผิดพลาดเพราะสิ่งนั้น อย่างไรก็ตามไม่ต้องกังวล ฉันมักจะรวบรวมข้อมูลสำรองซึ่งไม่ได้เป็นชุดข้อมูลจริงเพียง 1gb เท่านั้น จริงเป็น 26GB
Ludovic Zenohate Lagouardette

14

หากคุณไม่มีสิทธิ์เข้าถึงdos2unixแต่สามารถอ่านหน้านี้ได้คุณสามารถคัดลอก / วางdos2unix.py ได้จากที่นี่

#!/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))

ข้ามโพสต์จากsuperuser


1
การใช้งานทำให้เข้าใจผิด จริงdos2unixแปลงทุกการป้อนข้อมูลไฟล์โดยค่าเริ่มต้น การใช้งานของคุณหมายถึง-nพารามิเตอร์ และตัวจริงdos2unixคือตัวกรองที่อ่านจาก stdin เขียนไปยัง stdout หากไม่ได้รับไฟล์
jfs

8

ง่ายสุด ๆ ด้วย PCRE;

เป็นสคริปต์หรือแทนที่$@ด้วยไฟล์ของคุณ

#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@

สิ่งนี้จะเขียนทับไฟล์ของคุณในสถานที่!

ฉันขอแนะนำให้ทำสิ่งนี้กับการสำรองข้อมูลเท่านั้น (การควบคุมเวอร์ชันหรืออื่น ๆ )


ขอบคุณ! --งานนี้ถึงแม้ว่าฉันเขียนชื่อไฟล์และไม่มีการ ฉันเลือกโซลูชันนี้เพราะเข้าใจง่ายและปรับให้เข้ากับฉัน FYI, นี่คือสิ่งที่สวิตช์ทำ: -pสันนิษฐานว่าเป็น "ในขณะที่อินพุต", -iแก้ไขไฟล์อินพุตในสถานที่, -eเรียกใช้คำสั่งต่อไปนี้
Rolf

พูดอย่างเคร่งครัด PCRE เป็นการปรับปรุงเครื่องมือ regex ของ Perl ไม่ใช่เครื่องมือ regex จาก Perl พวกเขาทั้งสองมีความสามารถนี้แม้ว่าจะมีความแตกต่างกันทั้งๆที่มีการกำหนดชื่อ
tripleee

6

โซลูชัน awk ที่ง่ายยิ่งขึ้นโดยไม่มีโปรแกรม:

awk -v ORS='\r\n' '1' unix.txt > dos.txt

ในทางเทคนิค '1' เป็นโปรแกรมของคุณ b / c awk ต้องการหนึ่งตัวเลือกเมื่อได้รับ

UPDATE : หลังจากเข้ามาที่หน้านี้เป็นครั้งแรกอีกครั้งในระยะเวลานานฉันรู้ว่ายังไม่มีใครโพสต์โซลูชันภายในดังนั้นนี่คือ:

while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt

มันมีประโยชน์ แต่ต้องชัดเจน: นี่แปล Unix -> Windows / DOS ซึ่งเป็นทิศทางตรงกันข้ามกับสิ่งที่ OP ขอ
mklement0

5
มันทำโดยมีวัตถุประสงค์ทิ้งไว้เป็นแบบฝึกหัดสำหรับผู้แต่ง eyerolls awk -v RS='\r\n' '1' dos.txt > unix.txt
nawK

ยอดเยี่ยม (และความรุ่งโรจน์สำหรับคุณในการสอนกลเม็ดเด็ดพราย)
mklement0

1
"b / c awk ต้องการหนึ่งตัวเลือกเมื่อได้รับ" - awk ต้องใช้โปรแกรมเสมอไม่ว่าจะระบุตัวเลือกหรือไม่
mklement0

1
วิธีทุบตีบริสุทธิ์นั้นน่าสนใจ แต่ช้ากว่าวิธีแก้ปัญหาawkหรือเทียบเท่า sedนอกจากนี้คุณต้องใช้while IFS= read -r lineเพื่อรักษาบรรทัดอินพุตอย่างซื่อสัตย์มิฉะนั้นช่องว่างนำหน้าและต่อท้ายจะถูกตัดแต่ง (หรือไม่ใช้ชื่อตัวแปรในreadคำสั่งและทำงานด้วย$REPLY)
mklement0

5

มีเพียงไตร่ตรองคำถามเดียวกันนั้น (ฝั่ง Windows แต่ใช้ได้กับ linux อย่างเท่าเทียมกัน) ไม่มีใครพูดถึงวิธีอัตโนมัติในการแปลง CRLF <-> LF สำหรับไฟล์ข้อความโดยใช้zip -llตัวเลือกเก่า(Info-ZIP):

zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip 

หมายเหตุ: สิ่งนี้จะสร้างไฟล์ zip ที่เก็บชื่อไฟล์ดั้งเดิมไว้ แต่จะแปลงไฟล์ลงท้ายด้วย LF จากนั้นunzipจะแตกไฟล์เป็น zip'ed ซึ่งเป็นชื่อเดิม (แต่ใช้กับ LF-endings) ดังนั้นการแจ้งให้เขียนทับไฟล์ต้นฉบับในเครื่องหากมี

ข้อความที่ตัดตอนมาที่เกี่ยวข้องจากzip --help:

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)

คำตอบที่ดีที่สุดตามที่ฉันสามารถประมวลผลไดเรกทอรีทั้งหมดและไดเรกทอรีย่อย ฉันดีใจที่ฉันขุดลงไปไกลมาก
caram

5

น่าสนใจใน git-bash ของฉันบน windows sed ""ได้ทำการหลอกลวง:

$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text

ฉันเดาว่า sed ไม่สนใจพวกเขาเมื่ออ่านบรรทัดจากอินพุตและมักเขียนจุดสิ้นสุดบรรทัด unix บนเอาต์พุต


4

สิ่งนี้ใช้ได้สำหรับฉัน

tr "\r" "\n" < sampledata.csv > sampledata2.csv 

9
นี้จะแปลงทุกเดียว DOS-ขึ้นบรรทัดใหม่เข้าไปในสองยูนิกซ์บรรทัดใหม่
Melebius

2

สำหรับ Mac osx หากคุณติดตั้ง homebrew [ http://brew.sh/ เหมือนพี่น้อง 1]

brew install dos2unix

for csv in *.csv; do dos2unix -c mac ${csv}; done;

ตรวจสอบให้แน่ใจว่าคุณได้ทำสำเนาไฟล์ไว้เนื่องจากคำสั่งนี้จะแก้ไขไฟล์ให้ถูกต้อง ตัวเลือก -c mac ทำให้สวิตช์ทำงานร่วมกับ osx ได้


คำตอบนี้ไม่ใช่คำถามดั้งเดิมของผู้โพสต์
hlin117

2
ผู้ใช้ OS X ไม่ควรใช้-c macซึ่งใช้สำหรับการแปลงCRบรรทัดใหม่pre-OS X เท่านั้น คุณต้องการใช้โหมดนั้นเฉพาะไฟล์ที่ไปและกลับจาก Mac OS 9 หรือก่อนหน้า
askewchan

2

TIMTOWTDI!

perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof' PCfile.txt

ยึดตาม @GordonDavisson

เราต้องคำนึงถึงความเป็นไปได้ของ[noeol]...


2

คุณสามารถใช้ awk ตั้งค่าตัวคั่นเรคคอร์ด ( RS) เป็น regexp ที่ตรงกับอักขระขึ้นบรรทัดใหม่ที่เป็นไปได้ทั้งหมดหรือตัวอักษร และตั้งค่าตัวคั่นเร็กคอร์ดเอาต์พุต ( ORS) เป็นอักขระบรรทัดใหม่ของยูนิกซ์

awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt

นั่นคือสิ่งที่เหมาะกับฉัน (MacOS, การgit diffแสดง ^ M, แก้ไขเป็นกลุ่ม)
Dorian

2

บน Linux มันง่ายที่จะแปลง ^ M (ctrl-M) เป็น * nix newlines (^ J) ด้วย sed

มันจะเป็นอย่างนี้ใน CLI จริงๆแล้วจะมีการแบ่งบรรทัดในข้อความ อย่างไรก็ตาม, \ ผ่านนั้น ^ J ไปยังใจ:

sed 's/^M/\
/g' < ffmpeg.log > new.log

คุณได้รับสิ่งนี้โดยใช้ ^ V (ctrl-V), ^ M (ctrl-M) และ \ (แบ็กสแลช) ขณะที่คุณพิมพ์:

sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log

2
sed --expression='s/\r\n/\n/g'

ตั้งแต่คำถามที่กล่าวถึง sed นี่เป็นวิธีที่ตรงไปตรงมาที่สุดในการใช้ sed เพื่อให้บรรลุเป้าหมายนี้ สิ่งที่นิพจน์กล่าวคือแทนที่ carriage-return และ line-feed ด้วยเพียงแค่ line-feed เท่านั้น นั่นคือสิ่งที่คุณต้องการเมื่อคุณเปลี่ยนจาก Windows เป็น Unix ฉันยืนยันว่ามันใช้งานได้


เฮ้จอห์นปอล - คำตอบนี้ถูกตั้งค่าสถานะสำหรับการลบดังนั้นจึงเกิดขึ้นในคิวการตรวจทานสำหรับฉัน โดยทั่วไปเมื่อคุณมีคำถามเช่นนี้ซึ่งมีอายุ 8 ปีมี 22 คำตอบคุณจะต้องอธิบายว่าคำตอบของคุณมีประโยชน์อย่างไรในแบบที่คำตอบอื่น ๆ ที่มีอยู่ไม่ใช่
zzxyz

0

ในฐานะที่เป็นส่วนขยายของโซลูชัน Unix to DOS ของ Jonathan Leffler เพื่อแปลงเป็น DOS ได้อย่างปลอดภัยเมื่อคุณไม่แน่ใจเกี่ยวกับการสิ้นสุดบรรทัดปัจจุบันของไฟล์:

sed '/^M$/! s/$/^M/'

สิ่งนี้ตรวจสอบว่าบรรทัดนั้นยังไม่สิ้นสุดใน CRLF ก่อนที่จะแปลงเป็น CRLF


0

ฉันสร้างสคริปต์ตามคำตอบที่ยอมรับเพื่อให้คุณสามารถแปลงได้โดยตรงโดยไม่ต้องใช้ไฟล์เพิ่มเติมในตอนท้ายและลบและเปลี่ยนชื่อในภายหลัง

convert-crlf-to-lf() {
    file="$1"
    tr -d '\015' <"$file" >"$file"2
    rm -rf "$file"
    mv "$file"2 "$file"
}

ตรวจสอบให้แน่ใจว่าคุณมีไฟล์อย่างเช่น "file1.txt" ที่ "file1.txt2" ไม่มีอยู่แล้วหรือจะถูกเขียนทับฉันจะใช้มันเป็นที่เก็บไฟล์ชั่วคราว


0

ด้วย bash 4.2 และใหม่กว่าคุณสามารถใช้สิ่งนี้เพื่อตัดส่วนท้ายของ CR ซึ่งใช้ bash ในตัวเท่านั้น:

if [[ "${str: -1}" == $'\r' ]]; then
    str="${str:: -1}"
fi

-3

ฉันลอง file.txt ของ sed / s M M // // บน OSX และวิธีอื่น ๆ อีกหลายวิธี ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endingsหรือhttp://hintsforums.macworld.com/archive/index.php/t-125.html ) ไม่ทำงานไฟล์ยังคงไม่เปลี่ยนแปลง (จำเป็นต้องใช้ Ctrl-v Enter เพื่อทำซ้ำ ^ M) ในที่สุดฉันใช้ TextWrangler มันไม่ได้เป็นบรรทัดคำสั่งอย่างเคร่งครัด แต่มันใช้งานได้และมันก็ไม่บ่น

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