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?
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?
Câu trả lời:
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 unix2dos và dos2unix bắt chước các công cụ unix cũ cùng tên.
find . -name '*.txt' -print0 | xargs -null fromdos
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]
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!
Tôi làm điều này trên Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
Trong vi hoặc Vim :
:%s/^V^M//g
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.
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+d
thay thế.
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\n
bằ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
.
\r\n
sang \n
sử 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. ;)
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.
CR LF
để LF
sử 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 ( ).
1
là 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, 1
là đ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}
).
LF
to 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
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