2012-06-14 16 views
5

Tôi muốn đếm số lượng hard tab characters trong tài liệu của tôi trong vỏ unix.đếm số ký tự tab trong linux

Tôi có thể làm như thế nào?

tôi đã cố gắng một cái gì đó giống như

grep -c \t foo

nhưng nó mang lại tội danh t trong tập tin foo.

+1

Bạn có muốn đếm số lượng các ký tự tab hoặc số dòng chứa các ký tự tab không? Trong ví dụ bạn đưa ra, nếu '\ t' đã làm việc, bạn sẽ nhận được cái sau (* số dòng có chứa các tab *). –

Trả lời

12

Sử dụng tr để loại bỏ tất cả mọi thứ ngoại trừ tab, và sau đó đếm:

< input-file tr -dc \\t | wc -c 
+0

Tự hỏi ai khác ở đây đang tìm cách trả lời https://cmdchallenge.com/#/find_tabs_in_a_file này :) – BenB

2

Sử dụng tùy chọn perl regex (-P) cho ký tự tab grep.

Vì vậy, để đếm số ký tự tab trong một tập tin:

grep -o -P '\t' foo | wc -l 
+0

-P là GNU duy nhất và bài đăng này không được gắn thẻ Linux. – jordanm

3

Bạn có thể chèn một ký tự TAB đen giữa các dấu ngoặc kép với Ctrl + V + TAB.

Nói chung, bạn có thể chèn bất kỳ ký tự nào bằng cách đặt trước nó với Ctrl + V; thậm chí kiểm soát các ký tự như Nhập hoặc Ctrl + C mà trình bao sẽ diễn giải theo cách khác.

0

Suy nghĩ đầu tiên của tôi là sử dụng sed để loại bỏ tất cả các ký tự không phải tab, sau đó sử dụng wc để đếm số ký tự còn lại.

< foo.txt sed 's/[^\t]//g' | wc -c 

Tuy nhiên, điều này cũng tính các dòng mới, mà sed sẽ không chạm bởi vì nó dựa trên dòng. Vì vậy, hãy sử dụng tr để dịch tất cả các dòng mới thành dấu cách, do đó, nó là một dòng cho sed.

< foo.txt tr '\n' ' ' | sed 's/[^\t]//g' | wc -c 

Tùy thuộc vào vỏ và thực hiện các sed của bạn, bạn có thể phải sử dụng một tab đen thay vì \t, tuy nhiên, với Bash và GNU sed, các công trình trên.

7

Bash sử dụng một ký hiệu $'...' để xác định ký tự đặc biệt:

grep -c $'\t' foo 
1

Bạn có thể sử dụng awk một cách khéo léo: sử dụng tab làm dấu phân tách bản ghi, sau đó số lượng ký tự tab là tổng số bản ghi trừ 1:

ntabs=$(awk 'BEGIN {RS="\t"} END {print NR-1}' foo) 
+0

Và để đếm số ký tự tab trên mỗi dòng: 'awk 'BEGIN {FS =" \ t "} {print NF -1} 'foo' ('FS' là phân tách trường' awk'). –