( uid_2716 | 2010. 08. 06., p – 18:30 )

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'