Chuyển đổi CRLF thành nguồn cấp dữ liệu trên Linux


34

Cách tốt nhất để chuyển đổi CRLF thành nguồn cấp dữ liệu trong các tệp trên Linux là gì?

Tôi đã thấy các lệnh sed , nhưng có gì đơn giản hơn không?


4
Dupe: superuser.com/questions/38744/ Mạnh . Liên kết được cung cấp trong câu trả lời được chấp nhận bao gồm các tùy chọn dos2unix, perl và vi trong số các tùy chọn khác.
nagul

2
Điều này đã có câu trả lời tốt hơn mặc dù (vì vậy nếu một trong số này phải được đóng lại, thì có lẽ nên là câu trả lời đó)
Jonik

Câu trả lời:


40

Sử dụng lệnh này:

fromdos yourtextfile

Cách khác xung quanh:

todos yourtextfile

Các lệnh này được tìm thấy trong gói tofrodos (trên hầu hết các bản phân phối gần đây), cũng cung cấp hai hàm bao unix2dosdos2unix bắt chước các công cụ unix cũ cùng tên.


2
+1 Hữu ích hơn nhiều so với câu trả lời "Sử dụng dos2unix" được bình chọn hàng đầu hiện nay.
Jonik

1
Vâng, thậm chí tôi đang bỏ phiếu này. Của tôi là một gợi ý lái xe.
Ryan C. Thompson

Tôi sẽ cho thêm tiền thưởng nếu bạn nói làm thế nào để làm cho nó đệ quy. Hiện tại chỉ hoạt động với các ký tự đại diện.
sorin

2
@SorinSbarnea: đại loại nhưfind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre

@Jonik điều gì làm cho nó "hữu ích hơn nhiều"? Câu hỏi nghiêm túc
andrewtweber

24

Sử dụng dos2unix.

dos2unix - Bộ chuyển đổi định dạng tệp văn bản DOS / MAC sang UNIX

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

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

2
và unix2dos cho cách khác 'vòng.
quack quixote

Quack, bạn đang theo dõi tôi? Không phải là tôi không đánh giá cao nó, với tất cả các upvote.
Ryan C. Thompson

1
anh bạn, tôi ~ lang băm. phát âm "~" là "không". :) nhưng không, không theo dõi bạn, tho tôi dường như chạy vào bạn thường xuyên.
quack quixote

1
Xem xét chi tiết về cách tải tiện ích này cho hệ thống Linux của bạn. Ít nhất trên Ubuntu nó không được cài đặt theo mặc định (nhưng bằng cách cài đặt tofrodos gói bạn sẽ có được một cái gì đó rất giống nhau: packages.ubuntu.com/jaunty/tofrodos ).
Jonik

20

Tôi thích perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

Nhưng nó rất phù hợp với mục đích sử dụng của tôi và tôi rất dễ nhớ. Không phải tất cả các hệ thống đều có lệnh dos2unix, nhưng hầu hết những gì tôi làm việc đều có trình thông dịch perl.

Một cái khác là recode , một sự thay thế mạnh mẽ cho dos2unix và iconv; nó có sẵn trong gói "recode" trong kho Debian:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

Dành cho người hâm mộ awk :

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

... và sed :

sed 's/\r$//' winfile.txt > unixfile.txt

Và bây giờ, chỉ có một chút ít phức tạp hơn là xóa bằng tay CR trong trình soạn thảo hex, trực tiếp từ một trong những người bạn stackoverflow.com của chúng tôi , có thể sử dụng với trình thông dịch thịt bò (nằm trên kho lưu trữ Debian thân thiện của bạn),

dos2unix trong brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

cảm ơn jk vì đã lãng phí một giờ trong cuộc đời để viết bài này!


1
(sử dụng vô ích của mèo và) perl cũng phức tạp như sed ... do đó bạn không thực sự trả lời câu hỏi mà chỉ thu thập danh tiếng :)
akira

2
"cách tốt nhất" là chủ quan. điều này phù hợp nhất với tôi (tôi cảm thấy thoải mái hơn với perl so với sed). tôi không hứa nó sẽ làm việc tốt nhất cho bạn
quack quixote

@akira: một câu hỏi có thể có nhiều câu trả lời hợp lệ. Tôi cũng sử dụng phương pháp này, đôi khi, chủ yếu là kết hợp với các thay đổi khác, vì vậy nó chắc chắn là một câu trả lời hợp lệ; nhưng "sử dụng dos2unix" chắc chắn là câu trả lời thiết thực hơn trong hầu hết các tình huống. Vì vậy, tôi nghĩ rằng xếp hạng là tốt.
Revierpost

@akira: nếu bạn thấy nó đơn giản hơn, xin vui lòng gửi nó như một câu trả lời và khai sáng phần còn lại của chúng tôi.
quixote quixote

@ ~ quack: đó là điểm: nó không đơn giản. đó là giống nhau cho câu trả lời perl của bạn. u2d hoặc fromdos / todos là những câu trả lời đúng bởi vì chúng đơn giản hơn bất kỳ nội dung nào được thể hiện bằng bất kỳ ngôn ngữ lập trình nào khác.
akira

9

Tôi làm điều này trên Bash :

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

tốt đẹp. tôi thấy một đề cập khác của tr sớm ngày hôm nay. nó không phải là một chương trình được nhắc đến thường xuyên phải không?
quack quixote

7

Tôi nghĩ bạn cũng có thể sử dụng tr(mặc dù tôi không có tệp định dạng hài hước nào để thử):

tr -d '\r' < file1 > file2


4

Tôi đã tìm thấy một cách rất dễ dàng Tập tin mở bằng nano: ## nano file.txt

nhấn Ctrl + O để lưu, nhưng trước khi nhấn Enter nhấn: Alt + D để chuyển đổi các kết thúc dòng của DOS và Unix / Linux, hoặc: Alt + M để chuyển đổi kết thúc giữa các dòng Mac và Unix / Linux, sau đó nhấn Enter để lưu và Ctrl + X để thoát.


1
Bạn có thể chỉnh sửa câu trả lời của mình để làm rõ cài đặt chuyển đổi nào sẽ sao chép hành vi mà OP yêu cầu không?
Burgi

OP muốn chuyển đổi tắt kết thúc dòng hệ điều hành DOS, vì vậy Alt+d. Đôi khi alt bị chặn bởi chương trình đầu cuối, vì vậy bạn có thể sử dụng esc+dthay thế.
spinup

1
Rất nhiều phím tắt nano cũng hoạt động với phím Shift, điều này thường ngăn chặn việc chặn thiết bị đầu cuối, do đó, 'Alt-Shift-D' cũng hoạt động.
mwfearnley

3

Tôi thích Vim:set fileformat=unix. Mặc dù không phải là nhanh nhất, nhưng nó cho tôi một bản xem trước. Nó đặc biệt hữu ích trong trường hợp tệp có kết thúc hỗn hợp.


1

Nếu bạn muốn có một phương thức GUI, hãy thử trình soạn thảo văn bản Kate (các trình soạn thảo văn bản nâng cao khác cũng có thể xử lý việc này). Mở hộp thoại tìm / Thay thế ( Ctrl+ R) và thay thế \r\nbằng \n. (NB: bạn sẽ cần chọn "Biểu thức chính quy" từ trình đơn thả xuống và bỏ chọn "Chỉ lựa chọn" từ các tùy chọn.)

EDIT: Hoặc, nếu bạn chỉ muốn chuyển đổi sang định dạng Unix, sau đó sử dụng các tùy chọn menu Tools> End of Line> Unix.


Có các trình soạn thảo văn bản, chẳng hạn như jEdit, có thể thực hiện các chuyển đổi này một cách tự động - bạn chỉ cần nói với nó nếu bạn muốn phân tách dòng Unix, Windows hoặc Mac.
Jonik

Trên thực tế, KATE cũng có thể làm điều đó thông qua menu Công cụ> Kết thúc Dòng . Có lẽ tôi nên nghĩ nhiều hơn là trả lời chính xác câu hỏi - nhưng nếu bạn biết bạn đặc biệt muốn chuyển đổi \r\nsang \nsử dụng tìm kiếm / thay thế thì dễ hơn là nhớ hệ điều hành nào sử dụng kết thúc dòng nào. ;)
DisgruntledGoat

1

Dán đoạn mã này vào tập lệnh Python của 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))

Nên hoạt động trên mọi nền tảng đã cài đặt Python. Phạm vi công cộng.


1

CR LFđể LFsử dụng awk :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Ví dụ sử dụng:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Giải trình:

-v RS='\r?\n'đặt biến RS ( đầu vào r ecord s eparator) thành \r?\n, có nghĩa là đầu vào được đọc từng dòng được phân tách bởi LF ( \n) có thể ( ?trước CR ( \r) đi trước CR ( ).

1là kịch bản awk thực thi. Một kịch bản bao gồm condition { action }. Trong trường hợp này, 1là điều kiện để đánh giá là đúng. Hành động bị bỏ qua, vì vậy hành động mặc định được thực thi, có nghĩa là in dòng hiện tại (cũng có thể được viết dưới dạng {print $0}hoặc đơn giản {print}).


LFto CR LF: Bạn có thể đặt biến ORS( o utput r ecord s eparator) để sửa đổi các đầu dòng của đầu ra. Thí dụ:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C

0

Tôi đã sử dụng tập lệnh này cho các tập tin tôi cần để chuyển các tập tin khẩn cấp từ hệ thống windows sang hệ thống unix.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Tìm tất cả các tệp, đệ quy trong thư mục bạn đang chạy lệnh từ

xargs file

Truyền nó cho chương trình tập tin để có được một phân tích của tập tin.

grep CRLF

Chúng tôi chỉ muốn đầu ra của tệp hiển thị CRLF.

cut -d: -f1

Nhận đầu ra lên đến màu sắc. loại bỏ phần còn lại. Chúng ta chỉ nên có một tên tệp bây giờ

xargs dos2unix

Truyền tên tệp cho chương trình dos2unix bằng xargs .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.