2011-10-27 6 views
7

Estoy tratando de encontrar <li ><a href='xxxxxxxx'>some_link</a></li> y reemplazarlo por nada. Para hacer esto, ejecuto el siguiente comando pero está reconociendo $ como parte de una expresión regular.Perl un trazador de líneas para encontrar y reemplazar en un archivo con una variable

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

He probado las siguientes cosas,
${SOMEVAR}
\$SOMEVAR
FIND="<li ><a href=.*$SOMEVAR.*li>"; perl -p -i -e 's/$FIND//g' file.html

¿Alguna idea? Gracias.

+0

Gracias por hacerme ver por lo que el indicador '-i'. Esta genial. Consejo profesional: puedes juntar todas las banderas así: '-pie' – Chriszuma

+0

Además, felicitaciones en una primera publicación sólida. Problema descrito concisamente, junto con intentos de soluciones. Bien hecho. – Chriszuma

+1

@Chriszuma has probado la combinación actual de "pie "? – tadmc

Respuesta

8

Bash solo realiza la sustitución de variables con comillas dobles.

Esto debería funcionar:

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

EDITAR En realidad, eso podría actuar raro con el \n allí. Otro enfoque es aprovechar la concatenación de cadenas de Bash. Esto debería funcionar:

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

EDIT 2: Me tomó un vistazo más de cerca lo que está tratando de hacer, y que es un poco peligroso. Está utilizando el formulario greedy de .*, que podría coincidir con mucho más texto de lo que desea. Use .*? en su lugar. Actualicé las expresiones regulares anteriores.

1

Si "somevar" es realmente una variable externa, se puede exportar al medio ambiente y por lo tanto hace referencia a ella:

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