Tìm kiếm không phân biệt chữ hoa chữ thường trong awk


20

Tôi cần tìm kiếm một từ khóa bằng awk, nhưng tôi muốn thực hiện tìm kiếm không phân biệt chữ hoa chữ thường (không phân biệt chữ hoa chữ thường).

Tôi nghĩ cách tiếp cận tốt nhất là viết hoa cả cụm từ tìm kiếm ("từ khóa") và dòng mục tiêu mà awk đang đọc cùng một lúc. Từ câu hỏi này, tôi làm thế nào để sử dụng toupperđể in tất cả chữ hoa, nhưng tôi không biết cách sử dụng nó trong một trận đấu vì câu trả lời đó chỉ hiển thị in và không để lại văn bản chữ hoa trong một biến.

Đây là một ví dụ, được đưa ra đầu vào này:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

Tôi muốn đầu ra này:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Đây là những gì tôi có, nhưng tôi không biết cách thêm vào toupper:

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt

Câu trả lời:


23

Thay thế biểu thức của bạn để khớp với một mẫu (tức là /&&&key word&&&/) bằng một biểu thức khác sử dụng rõ ràng $0, dòng hiện tại:

tolower($0) ~ /&&&key word&&&/

hoặc là

toupper($0) ~ /&&&KEY WORD&&&/

vậy bạn có

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

Bạn cần một dấu ngoặc đơn vì $0khối BEGIN có thể được loại bỏ khi các biến được khởi tạo theo mặc định ""hoặc 0sử dụng lần đầu và {print}là hành động mặc định, như được đề cập trong các bình luận bên dưới.


4
Lưu ý rằng bạn có thể đơn giản hóa điều đó awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt. Không cần BEGINkhối và vì hành động mặc định là in, p;là đủ.
terdon

1
"Không cần BEGINkhối" vì một biến chưa được đánh giá là sai.
glenn jackman

Cảm ơn sự tối ưu. Tôi thường cố gắng giới hạn câu trả lời của mình với những thay đổi tối thiểu so với bản gốc, nhưng sự thật là kết quả mới chặt chẽ hơn và khá dễ đọc.
meuh

2
Chỉ cần một lưu ý: tolowercó mặt trên các hệ thống awk cổ (hoặc không quá cổ) (ví dụ: AIX), nhưng toupperkhông phải lúc nào cũng có sẵn ^^.
Olivier Dulac

16

gawk có một IGNORECASEbiến dựng sẵn, nếu được đặt thành khác không, làm cho tất cả các so sánh biểu thức chuỗi và biểu thức chính quy không phân biệt chữ hoa chữ thường. Bạn có thể sử dụng:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

vv Điều này là cụ thể gawk, mặc dù, nhưng tôi thấy nó dễ đọc hơn so với thay thế (di động hơn) bởi meuh. Cho dù đó là một vấn đề, tất nhiên, hoàn toàn tùy thuộc vào bạn.


1
Tôi đã muốn hỗ trợ awk trong nhiều năm cho một trong những dự án gawk lớn nhất của tôi, nhưng việc thiếu các trình kích hoạt tìm kiếm không nhạy cảm mà gawk đã làm cho nó không khởi động do số lượng tìm kiếm không nhạy cảm của trường hợp chạy. gensub là tính năng gawk khác chỉ quá khó để thay thế trong awk. Nhưng gawk không phải lúc nào cũng được cài đặt theo mặc định trên một số máy và bản phân phối, mặc dù hầu như luôn có sẵn, nhưng thật không may là vào năm 2016, họ không thể thay đổi awk và posix để mở rộng chức năng của các công cụ tiêu chuẩn như vậy một chút.
Lizardx

3
@Lizardx: đó là toàn bộ quan điểm không mở rộng: giữ tiêu chuẩn. Mặt khác, bạn chỉ cần tạo một tiêu chuẩn khác, và sau đó bạn có một số điểm không tương thích giữa chúng (chúng làm điều đó, nhưng cố gắng giữ các thay đổi tiêu chuẩn ở mức tối thiểu ... thậm chí sau đó, nhiều tiêu chuẩn là một trong những vấn đề chính của điện toán)
Olivier Dulac

2
Tôi không đồng ý. Với việc thực hiện cẩn thận, bạn có thể đưa ra các mở rộng trong khi hỗ trợ tất cả các phương thức cũ, điều gì xảy ra nếu bạn không làm điều đó là những thứ chỉ bắt đầu biến mất thành không liên quan theo thời gian. Tất cả mọi thứ trong điện toán phát triển, mẹo là để duy trì một sự tiến hóa đáng tin cậy rất ổn định. Bash là một ví dụ điển hình cho việc đó, siêu đáng tin cậy và chỉ cần thêm các tính năng mới, đó không phải là 'hai tiêu chuẩn', sử dụng những gì được hỗ trợ và một khi các thay đổi đã được triển khai trên toàn cầu, bạn có thể bắt đầu sử dụng các tính năng mới vì chỉ hệ thống di sản lâu đời nhất sẽ không có hỗ trợ.
Lizardx
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.