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?

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
,*,,*,

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'
,*,*,*,
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.