Làm cách nào để tìm các dòng chứa hơn 100 ký tự và có chứa nếu if?


8

Vì vậy, có lẽ tôi nên sử dụng grepcho việc này. Miễn là tôi cần tìm kiếm đệ quy tôi nên sử dụng grep -r. Nhưng sau đó tôi không biết mình nên làm gì tiếp theo;)

Làm thế nào tôi có thể làm điều đó?


4
find . -type f -exec awk 'length > 100 && /if/' {} +
Stéphane Chazelas

Tôi nhăn nhó khi nghĩ đến việc phải tìm kiếm thông qua một cơ sở mã cho Lines bằng một câu lệnh if hơn 100 ký tự để tái cấu trúc: -Z
Falco

@Falco Bản thân câu lệnh có thể đơn giản, chỉ cần thụt ra khá nhiều.
Kaz

Câu trả lời:


8

Bạn có thể sử dụng hai greps được kết nối bằng một đường ống:

grep -r '.\{100\}' /path | grep 'if'

Để loại trừ các tệp có iftrong đường dẫn hoặc tên của chúng, hãy sử dụng ':.*if'thay vì 'if'(vẫn có thể ngắt nếu tên tệp hoặc đường dẫn của bạn chứa dấu hai chấm).


4
Lưu ý rằng nó có thể báo cáo tất cả 100 dòng ký tự trong các tệp có iftrong đường dẫn của chúng
Stéphane Chazelas

@ StéphaneChazelas: Đúng. Bạn có thể sử dụng ':.*if'để ngăn chặn điều đó (trừ khi tên tệp của bạn chứa dấu hai chấm).
choroba

13

Với grepcác hỗ trợ tùy chọn ( -rđệ quy) và -P(PCRE) (hoặc pcregrepvới -r):

grep -rP '^(?=.{101}).*?if' .

Hoặc POSIXly:

find . -type f -exec awk 'length > 100 && /if/ {
   print FILENAME ": " $0}' {} +

(lưu ý rằng hành vi sẽ khác nhau giữa các lần triển khai đối với các tệp không phải là văn bản (các tệp chứa ký tự không, giá trị byte bằng 0, dòng quá dài hoặc dữ liệu sau dòng mới nhất). Cũng lưu ý rằng một số greptriển khai sẽ tìm kiếm trong các tệp không thường xuyên hoặc sẽ theo liên kết tượng trưng).


Tôi chỉ biết một grepđiều là có, và thậm chí một điều đó đòi hỏi sự hỗ trợ của nó được tích hợp sẵn để lib c hoạt động như tôi hiểu. Có nhiều hơn không?
mikeerv

1
@mikeerv, không chắc ý của bạn với lib c . Hỗ trợ regrec PCRE thường được cung cấp bởi libpcre. Một ngoại lệ là greptừ ast-open có triển khai regexps giống như perl. Các triển khai grep hỗ trợ grep -rPbao gồm GNU, FreeBSD / OS / X (viết lại của GNU grep bây giờ đang chuyển hướng) và ast-open's
Stéphane Chazelas

12

Sử dụng awk để đếm kích thước $ 0 và sự hiện diện của chuỗi con nếu?
awk '( length($0) > 100 && index($0,"if") ){print}' file

Nếu "nếu" phải là một từ (trái ngược với chuỗi con đơn giản), bạn có thể sử dụng awk '( length($0) > 100 && match($0,/\<if\>/) ){print}' file


6
Cách thành ngữ để viết nó awksẽ giống như awk 'length > 100 && /if/' file. Lưu ý rằng /\<if\>/, bạn cần GNU awk.
Stéphane Chazelas

@ StéphaneChazelas yeah, tôi đã thấy cú pháp của bạn và học đúng cách, nhưng vì bạn đã đăng câu trả lời nên tôi không thấy điểm nào trong việc sửa đổi của tôi. Tôi đã upvote câu trả lời của bạn, mặc dù.
Dani_l

4

Được điều chỉnh từ Tìm bất kỳ dòng nào vượt quá độ dài nhất định, bất kỳ dòng nào sau đây sẽ hoạt động để tìm dòng dài hơn 100 ký tự

grep '.\{100\}' file

perl -nle 'print if length$_>99' file

awk 'length($0)>99' file

sed -n '/.\{100\}/p' file

chọn phương pháp ưa thích của bạn và dẫn nó qua grep if


2
Phiên bản sed có thể thực hiện cả hai kiểm tra cùng một lúc; ví dụ sử dụng phần mở rộng GNU : sed -n '/.\{100\}/{/if/p}' file. Tương tự như perl one:perl -nle 'print if length$_>99 && /if/'
Toby Speight

3

với một đĩa đơn grep:

grep -vxE '.{0,99}|([^i]|i[^f])*i*' <in >out

sẽ chỉ chọn các dòng không thể được mô tả từ đầu đến đuôi bằng một trong hai câu lệnh. và do đó, bất kỳ dòng nào có thể được mô tả là bao gồm từ 0 đến 99 ký tự sẽ không được chọn và tương tự bất kỳ dòng nào khớp với hơn 99 ký tự mà vẫn không chứa ít nhất một ký tự nếu không sẽ được chọn.

printf '^%-100b$\n' 'if\nif' 'hey if' i if |
grep -nvxE '.{0,99}|([^i]|i[^f])*i*'

3:^hey if                                                                                              $
5:^if                                                                                                  $

bạn có thể làm tốt hơn chỉ để sử dụng hai greps, mặc dù.

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.