LinuxParty
OK, así que lo que quiere es hacer cosas desde la línea de comandos con adecuadas expresiones regulares. Bien es uno de los usos más comunes de las expresiones regulares, el de la línea de comandos utilizando grep. En este ejemplo encontrará todas las sentencias de una línea de perl Shebang (una línea como: #!/usr/bin/perl) en los archivos de trabajo actual, y encontrar así que todos los scripts de Perl:
grep '^#!.*perl' *
(Tenga en cuenta que esto sería encontrar archivos de texto con secuencias de comandos incluidas en ellos, así como los scripts ejecutables.)
- El caracter ^ significa "el comienzo de la línea '($ significa el final de la línea).
- El conjunto .* Significa "cualquier carácter (el período), cualquier número de veces (el *). Para "uno o más de las características anteriores, puede utilizar +.
OK, que lo que quiere hacer en la línea de comandos con adecuada las expresiones regulares? Una de las aplicaciones más comunes de expresiones regulares en la línea de comandos es con grep. Este ejemplo sería encontrar todas las instancias de una línea de perl Shebang (una línea como:
(#!/usr/bin/perl)
En los archivos en el directorio de trabajo actual, y encontrar
así que todos los scripts de Perl:
grep '^#!.*perl' *
o mejor...
grep "^#!.*bash" *
(Tenga en cuenta que esto sería encontrar archivos de texto con secuencias de comandos incluidas en ellos, así como los scripts ejecutables.) El ^ significa "el comienzo de la línea '($ significa el final de la línea). .* Significa "cualquier carácter (el período), cualquier número de veces (el *). Para "uno o más de las características anteriores, puede utilizar +.
He aquí otro ejemplo grep, esta vez para buscar las cosas que se parecen a los números de teléfono de un móvil del Reino Unido (07123 456789) en la carpeta de mi "direcciones" de correo electrónico:
grep -C 10 '07[0-9]\{3\} [0-9]\{6\}' ~/mail/addresses
-C 10
le muestra 10 líneas de contexto para cada resultado, que podría ser útil aquí en el número correspondiente al nombre.
El 07 hace coincidir exactamente para eso. [0-9] especifica cualquier dígito en ese rango ([0123] se especifica cualquiera de los dígitos 0, 1, 2, o 3). Por sí mismo, el rango irá acompañada de una vez.
\{3\}
Significa 'resultado del rango anterior, se mostrará en 3 veces (3 digitos).
[0-9]+ coincidiría con uno o más dígitos. Por último, [0-9]
\{6\}
Significa 'exactamente 6 dígitos.'
(07123 456789)
Otra utilidad en la que Perl puede ser útil en expresiones regulares. Usando Perl como un editor de flujo le da acceso a la instalacón de retrorreferencia de expresiones regulares. Esta línea modifica todos los archivos en el directorio actual, cambiando de cualquier instancia de Juliet a Juliet Kemp:
perl -i.old -pe 's#\b(Juliet)\b#$1 Kemp#g' *
-i.old significa que cualquier archivo modificado se guardará como filename.old antes de que sea cambiado. -pe establece Perl como un editor de flujo (se ejecutan en cada archivo a su vez, y ejecuta el siguiente comando). La expresón regular
\b(Juliet)\b
busca la palabra Juliet ocurriendo con un límite de palabra a cada lado: por lo que sólo recoge Juliet como una palabra, no como parte de una palabra (y por tanto no cambiaría el nombre de mi teórica colega Juliet). El paréntesis almacenan este valor en la variable $1: esto es la retrorreferencia.
La segunda parte de la búsqueda y reemplazo, $1 Kemp se remite a la primera parte de usar la variable $1, y añade mi apellido en el extremo.
El siguiente ejemplo sería útil si usted tiene un directorio en su sitio web que contiene archivos PDF y HTML todos mezclados, y usted acaba de decidir mover los archivos PDF en un directorio independiente. Para actualizar todas las
referencias en todos los archivos en el directorio actual, utilice esta línea:
perl -i.old -pe 's#<a href="/([^/]*\.pdf)">#<a href="/pdfdir/$1">#g' *La parte importante aquí es ([^/]* \.pdf).
El paréntesis de nuevo identifica la parte que almacena $1.
[^/]
Significa "cualquier carácter excepto /: un símbolo de intercalación entre corchetes significa negación.
Esta es la manera que usted sólo el cambiará file.pdf, no OtherDir/file.pdf
http://othersite/dir/file.pdf.
La estrella después significa "cualquier número de caracteres previa a la clase", es decir cualquier número de carácteres excepto /. \.pdf coincide exactamente .pdf:
Aquí, la barra invertida se utiliza para tratar el período como un período real, no con su especial significado de "cualquier caracter"
Usted puede encontrar un resumen de las opciones de expresión regular aquí.
http://linux.about.com/od/lts_guide/a/gdelts66t01.htm
encontrar y localizar
También puede utilizar expresiones regulares con find, con el modificador -regex. Por ejemplo, para encontrar todos los archivos .log en el directorio actual y sus subdirectorios:
find . -regex '.*\.log'
Es importante tener en cuenta que la expresión se ve en la ruta completa de cada archivo, no sólo el nombre de archivo. Así que la expresión regular debe coincidir con /ruta/a/mi/archivo.txt, no sólo filename.txt.
También puede utilizar el parámetro -regexp con locate:
locate --regexp '.*mail$'
encontrará cualquier ruta de archivo que termine en mail. (Tenga en cuenta
que este utiliza -regexp mientras que find utiliza -regex.)
En la segunda parte de esta serie, voy a mostrar a las expresiones regulares
utilizadas en los editores y otros lugares.
Artículo Anterior: Expresiones regulares en Linux, que son y cómo entenderlas
Artículo siguiente: Expresiones Regulares en Linux, Consejos avazandos para buscar y remplazar