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?
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:
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
,*,,*,
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'
,*,*,*,
svàgra khỏi dấu ngoặc kép?)