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


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 kết hợp tất cả 3 ký tự khoảng trắng tiếp theo (không gian tab) và thay thế chúng bằng 2 dấu cách. Điều này có thể giải quyết như thế nào?


185
2018-02-24 11:53


gốc




Các câu trả lời:


Lớp nhân vật \s sẽ khớp với các ký tự khoảng trắng <tab> và <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 với hai dấu cách.


NHẬN XÉT: Để tuân thủ POSIX, hãy sử dụng lớp nhân vật [[:space:]] thay vì \s, vì sau này là phần mở rộng GNU sed. Xem thông số POSIX cho quyến rũ và BRE


194
2018-02-24 12:08



aha! Đó là công tắc thiếu -e đã nhận tôi. - sequoia mcdowell
Tôi cũng đã phải thêm '-r' chuyển đổi cho phép mở rộng regex để làm cho sed nhận ra '\ s' như không gian. - HUB
Với Apple sed Tôi đã phải sử dụng [[:space:]] bởi vì \s không làm việc cho tôi. Có lẽ \s là một GNU sed sự mở rộng? - Jared Beck
@ JaredBeck cảm ơn, đã hết ý tưởng tại sao regex đơn giản của tôi không làm việc .. Đây là lame, tôi nghĩ \ s là tiêu chuẩn mở rộng regex .. Ngoài ra -r doesnt làm việc và -E đã ngồi xổm - Karthik T
Cảm ơn vì bạn đã phản hồi. Tôi đã cập nhật câu trả lời với các liên kết đến tiêu chuẩn POSIX. - mrucci


Tính năng này hoạt động trên MacOS 10.8:

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

55
2017-08-28 20:28



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? - amphibient
Nhìn chung, GNU sed sẽ không có -E. Từ trang người dùng BSD sed: "Các tùy chọn -E, -a và -i là các phần mở rộng FreeBSD không chuẩn và có thể không có sẵn trên các hệ điều hành khác." - Brad Koch
Tại sao bạn cần cờ -E, cho toán tử +? Hầu hết các biểu thức có lẽ sẽ tốt với * thay vào đó, sau đó điều này sẽ làm việc trên các nền tảng khác. - Samuel
@Samuel Nếu bạn sử dụng *, regex sẽ phù hợp với số không hoặc nhiều khoảng trống và bạn sẽ nhận được khoảng cách 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
FWIW, NetBSD của sed hỗ trợ -E cũng vậy. - mcandre


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


13
2018-04-07 15:12



Vì vậy, đối với nhu cầu cụ thể ở đây, với một sed cũ hơn, bạn có thể làm: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' inputfile trong đó X là một tab và Z là một không gian. - Marnix A. van Ammers


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

8
2017-07-22 14:52



Điều này có được đảm bảo để hoạt động trên bất kỳ phiên bản nào của sed trên bất kỳ hệ thống nào? Nếu không, nó có thể là đáng nói đến nơi mà điều này không làm việc trong một thời trang tương tự như các câu trả lời khác, chỉ vì vậy chúng tôi biết những hạn chế và nơi này có thể không có kết quả dự định. - Mokubai♦
RE này là những gì tôi sử dụng để phù hợp với khoảng trắng. Nó đơn giản hơn các lớp nhân vật chỉ để khớp với tab hoặc không gian. Nó chỉ sử dụng các quy ước cơ bản nhất của các biểu thức thông thường, vì vậy nó sẽ làm việc ở bất cứ đâu với việc thực hiện chức năng các biểu thức thông thường. - Nate
Trên máy Mac 10.9.5, nó phù hợp với không gian và 't'. Tôi đã sử dụng Michael Douma ở trên để khớp các ký tự khoảng trắng (nó cũng hoạt động với -e). - Alien Life Form
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 nơi có không gian hoặc nhiều khoảng trống hơn 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 một g ở cuối lệnh sed để phù hợ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 [[: dấu cách:]] cũng có thể được mong muốn, trong trường hợp có điều gì đó khác cho khoảng trống trong dòng. - jbo5112