Chu kỳ thực hiện của sed s / REGEXP / REPLACEMENT / g


14

Tại sao echo ,,, |sed s':\(,\)\(,\):\1*\2:'gnăng suất " ,*,," chứ không phải " ,*,*,"? Nói cách khác: tại sao, mặc dù có cờ "g", nhưng sed không chèn ' *' giữa một cặp dấu phẩy?

Câu trả lời:


14

Bởi vì với hai ,s (,\)\(,\), bạn đã khớp hai ,s đầu tiên và mẫu Regex khớp với nhau cho đến nay sẽ không quay lại cho phần còn lại của dòng. Bây giờ chỉ còn lại một cái duy nhất ,do đó nó chỉ được in như hiện tại mà không có bất kỳ cái nào *ở giữa nó là cái cuối cùng thứ hai.

Nếu bạn có ,đầu vào khác, bạn sẽ nhận được gphản hồi (toàn cầu, ) mong muốn :

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

Những gì với trích dẫn kỳ lạ? (Tại sao lại để lại sgra khỏi dấu ngoặc kép?)
GnP

@GnP Haha, đó là kế thừa từ OP.
heemayl

hoặcecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

Tại sao câu hỏi đã được trả lời bởi @heemayl

Giải pháp thay thế sed(ở đây giả sử GNU sed) - vòng lặp đệ quy miễn là tìm thấy kết quả khớp

$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,

POSIXly:

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,

Hoặc với perl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
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.