sed khoảng trắng phù hợp với sự nhầm lẫn


7
echo ' 1 2     3  '|sed 's/[[:space:]]*/_/g'

Tôi muốn xem _1_2_____3__như là đầu ra. Thay vào đó, tôi đang xem _1_2_3_như là đầu ra. Tôi đang làm gì vậy ??

EDIT
Một điều khác làm tôi bối rối, mà tôi quên đưa vào ví dụ trên, là tại sao điều này:

echo ' test1 test2  ' | sed 's/[[:space:]]*/_/g'

cho thấy điều này:

_t_e_s_t_1_t_e_s_t_2_

Làm thế nào có thể [[:space:]]phù hợp giữa tes...?


1
Các câu trả lời được đăng đã trả lời rằng quá. * khớp 0 hoặc nhiều khoảng trắng.
Leiaz

@Leiaz Hmmm .... không nghĩ về điều đó. Vì vậy, làm thế nào để tôi phù hợp với một hoặc nhiều?
BenjiWiebe

Với +echo ' test1 test2 ' | sed 's/[[:space:]]\+/_/g'
Leiaz

1
@Leiaz: Sử dụng 's/[[:space:]]\{1,\}/_/g'cho tính di động.
cuonglm

@Leiaz Ồ vâng ... đã quá lâu kể từ khi tôi học regex. Bây giờ tôi nhớ về '+'.
BenjiWiebe

Câu trả lời:


14

Bởi vì bạn sử dụng *, có nghĩa là nó phù hợp với 0 hoặc nhiều khoảng trắng. Vì vậy, không hoặc nhiều khoảng trắng được thay thế bởi một dấu gạch dưới _.

Thử:

$ echo ' 1 2     3  ' | sed 's/[[:space:]]/_/g'
_1_2_____3__

Hãy nhớ rằng [[:space:]]cũng phù hợp với tab, dòng mới, trở lại vận chuyển.

Ghi chú


5

Bạn đã có câu trả lời nhưng tôi muốn chỉ ra rằng trong kịch bản đơn giản như vậy, không cần phải cầu kỳ:

$ echo ' 1 2     3  ' | sed 's/ /_/g'
_1_2_____3__

Nếu bạn chỉ muốn thay thế khoảng trắng và tab, bạn cũng có thể sử dụng cấu trúc [\ t]:

$ echo -e " 1\t2     3  " | sed 's/[ \t]/_/g'
_1_2_____3__

1

Câu hỏi hỏi rõ ràng về sed, và đó là một câu hỏi rất hợp lệ về cú pháp regrec sed.

Nhưng trong trường hợp câu hỏi cơ bản là về việc thay thế khoảng trắng bằng cách _thực sự, đây là một câu trả lời thay thế bằng cách sử dụng "công cụ phù hợp cho công việc" để dịch các ký tự tr. ( man tr).

Lệnh tr abc 123thay thế các ký tự của danh sách đầu tiên bằng các ký tự tương ứng trong danh sách thứ hai. Do đó, tr ' ' _thay thế không gian bằng dấu gạch dưới.

$ echo ' 1 2     3  ' | tr ' ' _
_1_2_____3__


Để hiển thị trường hợp tổng quát hơn, bao gồm các loại khoảng trắng khác nhau như ví dụ của bạn,
đây là đầu ra chỉ dịch ký tự không gian bình thường ' 'để so sánh:

echo ' 1 2     3  x\ny\tz' | tr ' ' _        
_1_2_____3__x
y       z

Và đây là đầu ra khi dịch tất cả các ký tự của lớp: dấu cách: sang _:

echo ' 1 2     3  x\ny\tz' | tr '[:space:]' _
_1_2_____3__x_y_z_

(Lưu ý không có dòng mới ở cuối đầu ra - và có một dòng _sau z.)
Điều này có thể được viết rõ ràng như tr ' \t\n' _, đây là hình thức ngắn của tr ' \t\n' ___.

$ echo ' 1 2     3  x\ny\tz' | tr ' \t\n' _    
_1_2_____3__x_y_z_

Tôi biết về tr. Tôi sẽ mãi hối tiếc về ví dụ ban đầu tôi đã đăng. Tôi đặc biệt tự hỏi làm thế nào để thay thế một chuỗi khoảng trắng bằng một ký tự, mặc dù tôi đã làm rất kém khi giải thích điều đó.
BenjiWiebe

Tôi thực sự không đăng vấn đề thực sự của tôi lúc đầu, chỉ là một phần của nó. Tôi nghĩ rằng tôi có thể tìm ra vấn đề chính nếu tôi có thể vượt qua hành vi khó hiểu của ví dụ đầu tiên của tôi.
BenjiWiebe

Oh, bạn đã đủ rõ ràng rằng bạn hỏi về sed; Nhưng ngay cả khi câu trả lời không hữu ích cho bạn, nó có thể giúp người khác đọc câu hỏi và câu trả lời. Ai đó sử dụng sedlike trong câu trả lời ít nhất nên biết rằng có một công cụ đơn giản hơn nhiều cho việc này.
Volker Siegel
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.