Mengapa echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
menghasilkan " ,*,,
" daripada " ,*,*,
"? Dengan kata lain: mengapa, terlepas dari bendera "g", apakah sed tidak memasukkan ' *
' di antara sepasang koma?
Mengapa echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
menghasilkan " ,*,,
" daripada " ,*,*,
"? Dengan kata lain: mengapa, terlepas dari bendera "g", apakah sed tidak memasukkan ' *
' di antara sepasang koma?
Jawaban:
Karena dengan dua ,
s di (,\)\(,\)
, Anda telah mencocokkan dua ,
s pertama dan pola Regex yang cocok sejauh ini tidak akan mundur untuk sisa baris. Hanya satu yang tersisa sekarang yang terakhir ,
karena itu hanya dicetak karena tanpa ada *
di antara itu yang terakhir terakhir.
Jika Anda memiliki ,
input lain, Anda akan mendapatkan g
respons (global, ) yang diinginkan :
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
Kenapa pertanyaan itu sudah dijawab oleh @heemayl
Penanganan masalah dengan sed
( dengan asumsi GNU sed
) - loop secara rekursif selama kecocokan ditemukan
$ 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'
,*,*,*,
Atau dengan perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
dang
keluar dari tanda kutip?)