Làm thế nào để phù hợp với khoảng trắng trong sed?


218

Làm thế nào tôi có thể phù hợp với khoảng trắng trong sed? Trong dữ liệu của tôi, tôi muốn khớp tất cả hơn 3 ký tự khoảng trắng tiếp theo (không gian tab) và thay thế chúng bằng 2 khoảng trắng. Điều này có thể giải quyết như thế nào?

Câu trả lời:


226

Lớp nhân vật \ssẽ phù hợp với các ký tự khoảng trắng <tab><space>.

Ví dụ:

$ sed -e "s/\s\{3,\}/  /g" inputFile

sẽ thay thế mọi chuỗi của ít nhất 3 khoảng trắng bằng hai khoảng trắng.


LƯU Ý : Để tuân thủ POSIX, hãy sử dụng lớp ký tự [[:space:]]thay vì \s, vì lớp sau là phần mở rộng GNU sed. Xem thông số kỹ thuật POSIX cho sedBREs


5
aha Đó là công tắc -e mất tích đã giúp tôi.
sequoia mcdowell

25
Tôi cũng đã phải thêm công tắc '-r' cho phép regex mở rộng để khiến sed nhận ra '\ s' là không gian.
HUB

39
Với Apple sedtôi phải sử dụng [[:space:]]\skhông làm việc cho tôi. Có lẽ \slà một phần mở rộng GNU sed ?
Jared Beck

2
@JaredBeck cảm ơn, đã hết ý tưởng tại sao regex đơn giản của tôi không hoạt động .. Điều này thật khập khiễng, tôi nghĩ rằng đó là regex mở rộng tiêu chuẩn .. Ngoài ra -r không hoạt động và -E đã ngồi xổm
Karthik T

3
Thay vì [[:space:]người ta có thể sử dụng [[:blank:]]chỉ khớp với các tab ngang và dấu cách (nhưng không có dòng mới, tab dọc, v.v.).
stefanct

67

Điều này hoạt động trên MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

2
Bạn có biết nếu điều này hoạt động trên tất cả các bản phân phối Linux?
lưỡng cư

2
Nói chung, GNU sed sẽ không có -E. Từ trang sed man BSD: "Các tùy chọn -E, -a và -i là các tiện ích mở rộng FreeBSD không chuẩn và có thể không khả dụng trên các hệ điều hành khác."
Brad Koch

1
Tại sao bạn cần cờ -E, cho toán tử +? Hầu hết các biểu thức có thể sẽ ổn với * thay vào đó, sau đó điều này sẽ hoạt động trên các nền tảng khác.
Samuel

5
@Samuel Nếu bạn sử dụng *, regex sẽ khớp với 0 hoặc nhiều khoảng trắng và bạn sẽ có một khoảng trắng giữa mỗi ký tự và khoảng trắng ở mỗi đầu của mỗi dòng. Nếu bạn không có cờ -E, thì bạn muốn sed "s/[[:space:]]\+/ /g"khớp một hoặc nhiều khoảng trắng.
jbo5112

1
FWIW, sed của NetBSD cũng hỗ trợ -Ecờ.
mcand

13

Một số phiên bản cũ hơn của sed có thể không nhận ra \ là mã thông báo khớp với khoảng trắng. Trong trường hợp đó, bạn có thể khớp một chuỗi gồm một hoặc nhiều khoảng trắng và tab với '[XZ] [XZ] *' trong đó X là khoảng trắng và Z là tab.


1
Vì vậy, đối với nhu cầu cụ thể ở đây, với một chiếc sed cũ, bạn có thể làm: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' inputfile trong đó X là tab và Z là khoảng trắng.
Marnix A. van Ammer

10
sed 's/[ \t]*/"space or tab"/'

2
Điều này có được đảm bảo để hoạt động trên mọi phiên bản sedtrên bất kỳ hệ thống nào không? Nếu không, có thể đáng để đề cập đến nơi điều này hoạt động theo cách tương tự như các câu trả lời khác, chỉ để chúng tôi biết những hạn chế và nơi mà điều này có thể không có kết quả như mong muốn.
Mokubai

2
RE này là những gì tôi sử dụng để khớp với khoảng trắng. Nó đơn giản hơn các lớp ký tự chỉ để khớp với tab hoặc dấu cách. Nó chỉ sử dụng các quy ước cơ bản nhất của biểu thức chính quy, vì vậy nó nên hoạt động ở bất cứ đâu với việc thực hiện chức năng của biểu thức chính quy.
Nate

3
Trên Mac 10.9.5, điều này phù hợp với không gian và 't'. Tôi đã sử dụng Michael Douma ở trên để khớp với các ký tự khoảng trắng (nó cũng hoạt động với -e).
Mẫu cuộc sống ngoài hành tinh

Không hoạt động hợp lý trên hệ thống SUSE của tôi. Nó khớp với vị trí đầu tiên trên dòng không có khoảng trống hoặc nhiều khoảng trắng, nằm trước ký tự đầu tiên. Tôi nghi ngờ đó là chức năng dự định và chắc chắn không phải là trường hợp sử dụng được yêu cầu. Tôi tin rằng bạn muốn thay đổi '*' cho '\ +' (hoặc '\ {3, \}' cho mỗi câu hỏi) và có thể đặt ag ở cuối lệnh sed để khớp với tất cả các lần xuất hiện của mẫu. Việc thay thế [\ t] bằng [[: space:]] cũng có thể được mong muốn, trong trường hợp có một cái gì đó khác cho khoảng trắng trong dòng.
jbo5112
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.