Mengapa echo ,,, |sed s':\(,\)\(,\):\1*\2:'gmenghasilkan " ,*,," daripada " ,*,*,"? Dengan kata lain: mengapa, terlepas dari bendera "g", apakah sed tidak memasukkan ' *' di antara sepasang koma?
Mengapa echo ,,, |sed s':\(,\)\(,\):\1*\2:'gmenghasilkan " ,*,," 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 grespons (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'
,*,*,*,
sdangkeluar dari tanda kutip?)