wc -L báo cáo độ dài dòng là 8 cho tab-char. lỗi hay tính năng?


12

-Llà một tính năng hữu ích của wc, hoặc vì vậy tôi nghĩ. Nó in chiều dài của dòng dài nhất. Vì một số lý do, nó mở rộng tab byte đơn thành một chiều dài 8.
Có cách nào để đặt cái này thành không "mở rộng" tab không? và những gì có thể là lý do đằng sau sự mở rộng này?

echo -n $'\t' | wc -L

đầu ra 8

wc (GNU coreutils) 7.4
GNU bash, phiên bản 4.1.5


Các -n là trực giao cho câu hỏi.
người dùng không xác định

Câu trả lời:


11

Tôi thấy không có báo cáo lỗi liên quan đến điều này và các dòng sau trong tệp nguồn wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

dường như cố tình chọn cách cư xử theo cách này, có lẽ để đưa ra gợi ý về chiều rộng cần thiết để hiển thị tệp trên màn hình.

Một sự thay thế nhanh chóng có thể là

echo -n $'\t' | tr '\t' ' ' | wc -L

2
Cảm ơn enzo, giờ tôi đã thấy rằng mặc dù man wckhông đề cập đến vấn đề này, nhưng nó được nêu trong info coreutils 'wc invocation'(mà 'người đàn ông' cũng đề cập đến) ... Ngoài ra, sau khi truy tìm google-sphere thêm một chút, tôi thấy đây là một giải pháp thay thế echo -n $'\t' | expand -t1 | wc -L, khá giống với giải pháp thay thế của bạn, nhưng tôi đã đưa nó vào một biện pháp tốt .. Và mặc dù liên kết sau đây là một bản hack wc biên dịch lại * , nó có thể được một số người quan tâm: hỗ trợ wc cho các độ rộng tab khác nhau
Peter.O

1

Thông thường, một tab được mở rộng đến vị trí tiếp theo, (chia hết cho 8) +1 [1, 9, 17, 25, ...], vì vậy nếu bạn yêu cầu, bạn sẽ nhận được nó.

Lưu ý rằng -n không liên quan đến câu hỏi, nhưng $ thì không.

echo foo$'\t' | wc -L

cũng sẽ trả lại 8 vì

echo foo$'\t'bar 
foo     bar

Bạn có thể bỏ qua $, nếu bạn sử dụng -e cho echo:

echo -e '\t' | wc -L
8

Vì vậy, nếu bạn muốn tính '\ t' là một byte đơn, chỉ cần bỏ qua -e và $:

echo '\t' | wc -L
2

Có, các tab mở rộng đủ phổ biến cho đầu ra được in / hiển thị, nhưng tôi thấy kỳ lạ là một chương trình đếm byte và từ sẽ tính 1 ký tự là bất cứ thứ gì ngoài 1 ký tự ... btw echo '\t'không xuất ra tab-char (\ x09). Nó xuất ra một dòng có độ dài là 2, tức là. a '\'và a 't'. Một dòng mới không phải là một phần của độ dài của một dòng ... (Tôi đã có một -nví dụ của mình để kiểm tra xem liệu wccó xử lý đúng cách một tệp không có dòng mới-char ...)
Peter.O

wc --helpnói : -L, --max-line-length print the length of the longest line?. Nó không nói về byte, nhưng độ dài dòng.
người dùng không xác định

1
Đúng, nó có ghi "in độ dài của dòng dài nhất" ... `nhưng nó không nói " Chúng tôi giả sử rằng bạn muốn các tab được mở rộng (không phải số ký tự thông thường, như hầu hết các hàm độ dài khác) .. Oh, bởi bằng cách này, chúng tôi sẽ mở rộng các tab thành 8 khoảng trắng, bất kể điểm dừng tab cụ thể của bạn được đặt là gì. " ... Đó là cái bẫy .. Nó không được ghi chép lại.
Peter.O

Làm thế nào để bạn thiết lập các tab với? Trong Bash? Hơn nữa: Các tab không được mở rộng thành 8 khoảng trắng, nhưng đến các vị trí, hãy xem echo -e foo'\t'bar | wc -Lkết quả nào trong 11, không phải trong 14.
người dùng không biết

Trong foo\tbarví dụ trên , wcđã giả sử các điểm dừng tab ở khoảng cách danh nghĩa là 8 ... Ví dụ sau đây cho thấy cách wcbỏ qua các cài đặt dừng tab hiện đang hoạt động. Nó xuất một dòng tới thiết bị đầu cuối rộng 8 cột / dài, nhưng wcbáo cáo là 11. Ví dụ này đặt các điểm dừng tab cho mỗi cột thứ 6 ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O 13/11/11

0

Mô tả wc -L là mơ hồ. Nó trả về chiều rộng màn hình rộng nhất. Để kiểm soát mở rộng tab, bạn có thể lọc qua expandđầu tiên.

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.