A másik posztom alapján ezt össze lehet kalapálni, csak egy kicsit trükkös, mert mindig meg kell nézni, hogy amikor kiléptünk az illeszkedő prefix-ből, akkor mivel léptünk ki -- idézőjellel vagy sem. Ha ui. nem idézőjellel, akkor a következő idézőjelig fel kell enni mindent. Az idézőjel vizsgálata egyúttal elintézi a szóvég-kérdést is. Ezért a rekurzívan alkalmazandó kifejezés így fog kinézni:
T()|U()|"|[^TU"][^"]*"Magyarázat: T és U a normál következő karakterek, ekkor rekurzívan folytatjuk a vizsgálatot. Idézőjel esetén kiszállunk (megtaláltuk a végét illeszkedéssel, csere lesz). Ha egyik eset sem áll fenn, akkor szintén megtaláltuk a végét (idézőjeltől eltérő karakterrel), ugyanakkor fel kell nyalnunk idézőjellel bezárólag a hátralévő sztringet, hogy a cserében majd hivatkozhassunk rá.
Itt a fa:
*
/ \
'/' 'h'
|
't'
|
't'
|
'p'
|
':'
|
'/'
|
'/'
Alkalmazva a képletet (és élve azzal, hogy a bevezető "/" alatt már nincs további vizsgálat):
h(
t(
t(
p(
:(
/(
"|[^/"][^"]*"
)|"|[^/"][^"]*"
)|"|[^:"][^"]*"
)|"|[^p"][^"]*"
)|"|[^t"][^"]*"
)|"|[^t"][^"]*"
)|"|[^/h"][^"]*"
Ezzel a MINTA készen van. Ezt berakjuk egy pár zárójelbe. Ez a legkülső kifejezés (vagyis a
(MINTA)) akkor fog illeszkedni, ha a tiltott prefixek nem szerepelnek, és ekkor a (MINTA) kifejezés által elkapott érték tartalmazni fogja a lezáró idézőjelet is. Ennek megfelelően az alábbi sed parancs ajánlott (case insensitive, extended regex, soronként bárhány csere, és persze a PREFIX-et ki kell tölteni):
sed -r 's,href *= *"(MINTA),href="PREFIX\1,gi'Kifejtve az egészet (kivéve a PREFIX-et, de simán írj be a helyébe
http://-t):
sed -r 's,href *= *"(h(t(t(p(:(/("|[^/"][^"]*")|"|[^/"][^"]*")|"|[^:"][^"]*")|"|[^p"][^"]*")|"|[^t"][^"]*")|"|[^t"][^"]*")|"|[^/h"][^"]*"),href="PREFIX\1,gi'