Sử dụng sed -e "s/[[:space:]]\+/ /g"
Đây là một lời giải thích:
[ # start of character class
[:space:] # The POSIX character class for whitespace characters. It's
# functionally identical to [ \t\r\n\v\f] which matches a space,
# tab, carriage return, newline, vertical tab, or form feed. See
# https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
] # end of character class
\+ # one or more of the previous item (anything matched in the brackets).
Để thay thế, bạn chỉ muốn chèn một khoảng trắng. [:space:]
sẽ không hoạt động ở đó vì đó là tên viết tắt của một lớp nhân vật và công cụ regex sẽ không biết nhân vật nào được đặt ở đó.
Các +
phải được thoát ra trong regex vì với động cơ regex sed của +
là một nhân vật bình thường trong khi \+
là một metacharater cho 'một hoặc nhiều'. Trên trang 86 của Làm chủ các biểu thức chính quy , Jeffrey Friedl đã đề cập đến một chú thích rằng ed và grep đã sử dụng dấu ngoặc đơn thoát vì "Ken Thompson cảm thấy các biểu thức chính quy sẽ được sử dụng để làm việc chủ yếu với mã C, trong đó việc khớp với dấu ngoặc thô sẽ phổ biến hơn so với phản hồi ngược . " Tôi cho rằng anh ta cũng cảm thấy như vậy về dấu cộng, do đó cần phải thoát khỏi nó để sử dụng nó như một siêu vi khuẩn. Thật dễ dàng để vượt qua điều này.
Trong sed bạn sẽ cần phải thoát khỏi +
, ?
, |
, (
, và )
. hoặc sử dụng -r để sử dụng regex mở rộng (sau đó có vẻ như sed -r -e "s/[[:space:]]\+/ /g"
hoặcsed -re "s/[[:space:]]\+/ /g"