2013-03-19 9 views
9

Tôi đã thử gần như tất cả mọi thứ (tôi đoán) nhưng không có gì hiệu quả. (Hệ điều hành: Ubuntu 12,04)Ký tự không gian Regex trong Sed

Expressions để được xuất hiện (lấy ra từ tập tin văn bản):

a c 4 
a k 23 
o s 1 

gì tôi đã cố gắng:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi' 
's/.\s.\s[0-9]+//g' 
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+' 

Trả lời

13

này phải phù hợp:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi' 

Lần thử đầu tiên của bạn bỏ lỡ một vài dấu ngoặc vuông và bạn không cần ngoài cùng o ne:

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input 

dụ thứ 2 của bạn không thành công vì bạn cần phải thoát khỏi +, và vẫn còn nó sẽ chỉ làm việc trong gnu sed:

sed 's/.\s.\s[0-9]\+//g' input 

Ngoài ra một số vấn đề tương tự với tác phẩm mới nhất:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input 
1

Cái ở giữa là đóng! Bạn phải thoát khỏi dấu cộng vì một lý do vượt ra ngoài tôi. Tôi cũng thay thế dấu chấm "." bằng "[a-z]" để chỉ khớp với chữ cái.

sed 's/[a-z]\s[a-z]\s[0-9]\+//g' 

Thưởng phiên bản di động cho cũ hơn sed -Versions (Xin chào, người dùng Mac!). Một số sed triển khai là kén chọn vào "+":

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g' 
1

[...] định nghĩa một lớp nhân vật. [a-z] khớp với bất kỳ ký tự nào từ a đến z. Để khớp các ký tự liên tiếp, bạn phải sử dụng một lớp cho mỗi ký tự: [a-z][[:space:]][a-z].

Đối với + để có ý nghĩa đặc biệt, bạn phải gạch chéo ngược: [0-9]\+.

Các lớp ký tự được đặt tên chỉ hoạt động bên trong các lớp ký tự, tức là [[:alpha:]][[:space:]].