it-swarm-vi.tech

Làm thế nào để bạn tìm kiếm các tệp chứa kết thúc dòng dos (CRLF) với grep trên Linux?

Tôi muốn tìm kiếm các tệp chứa kết thúc dòng dos với grep trên Linux. Một cái gì đó như thế này:

grep -IUr --color '\r\n' .

Ở trên dường như khớp với chữ rn không phải là điều mong muốn.

Đầu ra của cái này sẽ được dẫn qua xargs thành todos để chuyển đổi crlf thành lf như thế này

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

Sử dụng Ctrl+VCtrl+M để nhập ký tự Vận chuyển theo nghĩa đen vào chuỗi grep của bạn. Vì thế:

grep -IUr --color "^M"

sẽ hoạt động - nếu ^M có CR theo nghĩa đen mà bạn nhập như tôi đề xuất.

Nếu bạn muốn danh sách các tệp, bạn muốn thêm -l tùy chọn là tốt.

Giải thích

  • -I bỏ qua các tệp nhị phân
  • -U ngăn grep loại bỏ các ký tự CR. Theo mặc định, nó sẽ làm điều đó nếu nó quyết định đó là một tệp văn bản.
  • -r đọc tất cả các tệp trong mỗi thư mục đệ quy.
110
pjz

grep có lẽ không phải là công cụ bạn muốn cho việc này. Nó sẽ in một dòng cho mỗi dòng phù hợp trong mỗi tệp. Trừ khi bạn muốn, giả sử, chạy todos 10 lần trên tệp 10 dòng, grep không phải là cách tốt nhất để thực hiện. Sử dụng find để chạy tệp trên mỗi tệp trong cây, sau đó chuyển qua đó cho "CRLF" sẽ giúp bạn có một dòng đầu ra cho mỗi tệp có kết thúc dòng kiểu dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

sẽ giúp bạn có được một cái gì đó như:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators
143
Thomee
49
Steven Penny

Nếu phiên bản grep của bạn hỗ trợ - P (--Perl-regapi) tùy chọn, thì

grep -lUP '\r$'

có thể được sử dụng.

16
Linulin
# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative
7
yabt

Truy vấn là tìm kiếm ... Tôi có một vấn đề tương tự ... ai đó đã gửi các kết thúc dòng hỗn hợp vào kiểm soát phiên bản, vì vậy bây giờ chúng tôi có một loạt các tệp có 0x0d0x0d0x0a kết thúc dòng. Lưu ý rằng

grep -P '\x0d\x0a'

tìm thấy tất cả các dòng, trong khi

grep -P '\x0d\x0d\x0a'

grep -P '\x0d\x0d'

không tìm thấy dòng nào nên có thể có một cái gì đó "khác" đang diễn ra bên trong grep khi nói đến các mẫu kết thúc dòng ... thật không may cho tôi!

3
Peter Y

Bạn có thể sử dụng lệnh tập tin trong unix. Nó cung cấp cho bạn mã hóa ký tự của tệp cùng với các đầu cuối dòng.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
2
Murali Krishna Parimi

Nếu, giống như tôi, unix tối giản của bạn không bao gồm các chi tiết như lệnh tệp và dấu gạch chéo ngược trong grep biểu thức chỉ không hợp tác, hãy thử điều này:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

Những sửa đổi bạn có thể muốn thực hiện ở trên bao gồm:

  • Tinh chỉnh lệnh find để xác định vị trí các tệp bạn muốn quét
  • thay đổi lệnh dump thành od hoặc bất kỳ tiện ích kết xuất tệp nào bạn có
  • xác nhận rằng lệnh cut bao gồm cả không gian hàng đầu và dấu cũng như đầu ra ký tự thập lục phân từ tiện ích dump
  • giới hạn đầu ra dump ở 1000 ký tự đầu tiên hoặc lâu hơn để đạt hiệu quả

Ví dụ: một cái gì đó như thế này có thể phù hợp với bạn bằng cách sử dụng od thay vì dump:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
1
MykennaC