2011-10-27 12 views
7

Sto cercando di trovare <li ><a href='xxxxxxxx'>some_link</a></li> e sostituirlo con niente. Per fare questo, sto eseguendo il comando qui sotto, ma sta riconoscendo $ come parte di una regex.Perl un liner da trovare e sostituire in un file con una variabile

perl -p -i -e 's/<li ><a href=.*$SOMEVAR.*li>\n//g' file.html

Ho provato le seguenti cose,
${SOMEVAR}
\$SOMEVAR
FIND="<li ><a href=.*$SOMEVAR.*li>"; perl -p -i -e 's/$FIND//g' file.html

Tutte le idee? Grazie.

+0

Grazie per avermi fatto lo sguardo ciò che il flag '-i' fa. È bello Suggerimento: puoi mettere insieme tutte le bandiere in questo modo: '-pie' – Chriszuma

+0

Inoltre, i complimenti su un solido primo post. Problema descritto in modo conciso, insieme a soluzioni tentate. Molto bene. – Chriszuma

+1

@Chriszuma hai provato la combinazione -pie effettiva? – tadmc

risposta

8

Bash esegue solo sostituzione variabile con virgolette doppie.

Questo dovrebbe funzionare:

perl -p -i -e "s/<li ><a href=.*?$SOMEVAR.*?li>\n//g" file.html 

EDIT In realtà, che potrebbe agire strano con la \n in là. Un altro approccio è quello di sfruttare la concatenazione di stringhe di Bash. Questo dovrebbe funzionare:

perl -p -i -e 's/<li ><a href=.*?'$SOMEVAR'.*?li>\n//g' file.html 

EDIT 2: Ho appena preso uno sguardo più da vicino a quello che stai cercando di fare, ed è un po 'pericoloso. Stai utilizzando il modulo greedy di .*, che potrebbe abbinare molto più testo di quanto desideri. Utilizzare invece .*?. Ho aggiornato le regex di cui sopra.

1

Se "somevar" è veramente una variabile esterna, è possibile esportarlo per l'ambiente e fa riferimento così:

SOMEVAR=whatever perl -p -i -e 's/<li ><a href=.*$ENV{SOMEVAR}.*li>\n//g' file.html 
Problemi correlati