Siklus eksekusi sed / REGEXP / REPLACEMENT / g

14

Mengapa echo ,,, |sed s':\(,\)\(,\):\1*\2:'gmenghasilkan " ,*,," daripada " ,*,*,"? Dengan kata lain: mengapa, terlepas dari bendera "g", apakah sed tidak memasukkan ' *' di antara sepasang koma?

pengguna3143179
sumber

Jawaban:

14

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
,*,,*,
heemayl
sumber
Ada apa dengan kutipan aneh? (Mengapa meninggalkan sdan gkeluar dari tanda kutip?)
GnP
@ GnP Haha, itu diwarisi dari OP.
heemayl
atauecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot
8

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'
,*,*,*,
Sundeep
sumber