ทำไมecho ,,, |sed s':\(,\)\(,\):\1*\2:'g
ผลผลิต " ,*,,
" มากกว่า " ,*,*,
" กล่าวอีกนัยหนึ่ง: ทำไมถึงแม้ธง "g" ไม่ได้แทรก ' *
' ระหว่างเครื่องหมายจุลภาคหนึ่งคู่
ทำไมecho ,,, |sed s':\(,\)\(,\):\1*\2:'g
ผลผลิต " ,*,,
" มากกว่า " ,*,*,
" กล่าวอีกนัยหนึ่ง: ทำไมถึงแม้ธง "g" ไม่ได้แทรก ' *
' ระหว่างเครื่องหมายจุลภาคหนึ่งคู่
คำตอบ:
เพราะด้วยสอง,
นิ้ว(,\)\(,\)
คุณได้จับคู่สอง,
รูปแบบแรกและรูปแบบ Regex ที่ตรงกับแล้วจะไม่ย้อนกลับสำหรับส่วนที่เหลือของบรรทัด เหลือเพียงอันเดียวที่เหลืออยู่ในขณะนี้ซึ่งเป็นครั้งสุดท้าย,
ดังนั้นจึงพิมพ์ออกมาตามที่ไม่มี*
อยู่ระหว่างที่หนึ่งล่าสุด
หากคุณมี,
อินพุตอื่นคุณจะได้รับคำตอบที่ต้องการ (ทั่วโลกg
):
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
ทำไม@heemayl ตอบคำถามแล้ว
วิธีแก้ปัญหาด้วยsed
(ที่นี่สมมติว่า GNU sed
) - วนซ้ำหากพบการแข่งขันซ้ำ
$ 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'
,*,*,*,
หรือด้วย perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
และg
ออกจากเครื่องหมายคำพูดหรือไม่)