Tại sao echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
nă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?
Tại sao echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
nă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:
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 g
phản hồi (toàn cầu, ) mong muốn :
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
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'
,*,*,*,
s
vàg
ra khỏi dấu ngoặc kép?)