รอบการดำเนินการของ sed s / REGEXP / REPLACEMENT / g


14

ทำไมecho ,,, |sed s':\(,\)\(,\):\1*\2:'gผลผลิต " ,*,," มากกว่า " ,*,*," กล่าวอีกนัยหนึ่ง: ทำไมถึงแม้ธง "g" ไม่ได้แทรก ' *' ระหว่างเครื่องหมายจุลภาคหนึ่งคู่

คำตอบ:


14

เพราะด้วยสอง,นิ้ว(,\)\(,\)คุณได้จับคู่สอง,รูปแบบแรกและรูปแบบ Regex ที่ตรงกับแล้วจะไม่ย้อนกลับสำหรับส่วนที่เหลือของบรรทัด เหลือเพียงอันเดียวที่เหลืออยู่ในขณะนี้ซึ่งเป็นครั้งสุดท้าย,ดังนั้นจึงพิมพ์ออกมาตามที่ไม่มี*อยู่ระหว่างที่หนึ่งล่าสุด

หากคุณมี,อินพุตอื่นคุณจะได้รับคำตอบที่ต้องการ (ทั่วโลกg):

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

ใบเสนอราคาแปลกคืออะไร? (ทำไมลาsและgออกจากเครื่องหมายคำพูดหรือไม่)
GnP

@GnP ฮ่าฮ่านั่นเป็นสิ่งที่สืบทอดมาจาก OP
heemayl

หรือecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

ทำไม@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'
,*,*,*,
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.