Expresión regular en Unix/Linux

Una expresión regular es una cadena que se puede utilizar para describir diferentes secuencias de caracteres. Varios comandos de Unix suelen utilizar una expresión regular, incluidos ed, sed, awk, grep y micro dominios

Este capítulo le mostrará cómo usar la expresión regular con sed .

Aquí siéntate, abreviado de s tranvía mi ditor es un editor de navegación de cadenas que está diseñado exclusivamente para secuencias de comandos individuales, por lo que todos los datos de entrada que ingresa se transmiten mediante STDOUT y no cambian el archivo de entrada.

Llame a sed en Unix/Linux

Antes de comenzar, asegúrese de tener una copia interna del archivo /etc/passwd para trabajar con ella. sed .

Como se mencionó anteriormente, se puede llamar a sed enviándole datos a través de una tubería de la siguiente manera:

  $ cat / etc / passwd |  sed Usage : sed [ OPTION ] . { script - other - script } [ input - file ] . - n , - quiet , - silent suppress automatic printing of pattern space - e script , - expression = script ...... 

El comando cat vuelca el contenido de /etc/passwd a sed a través de una canalización en el espacio de muestra de sed. El espacio muestral es el área de trabajo interna que usa sed para hacer su trabajo.

La sintaxis general de Sed en Unix/Linux

Aquí está la sintaxis general para sed:

  / pattern / action 

Aquí, modelo es una expresión regular, cuya acción es uno de los comandos proporcionados en la siguiente tabla. Si se omite el patrón, la acción se ejecuta para cada fila, como se explicó anteriormente.

La barra inclinada que rodea la plantilla es obligatoria porque se utilizan como marcadores de límites.

Secuencia Descripción Imprimir línea d Eliminar línea s / plantilla1 / plantilla2 / Reemplazar el evento de la plantilla 1 con el evento de la plantilla 2.

Eliminar todas las filas con sed

Vuelva a llamar a sed, pero esta vez dígale a na sed que use el comando de edición para eliminar las líneas marcadas con una d:

  $ cat / etc / passwd |  sed 'd' $ 

En lugar de llamar a sed enviándole un archivo a través de una canalización, puede indicarle a sed que lea los datos de un archivo, como en el siguiente ejemplo.

El siguiente comando hace exactamente lo mismo que se mencionó anteriormente. Estás tratando de practicarlo sin usar el comando cat.

  $ sed - e 'd' / etc / passwd $ 

Posicionamiento SED en Unix/Linux

Sed también entiende algo llamado direcciones. La dirección es una ubicación separada en un archivo o un rango al que se debe aplicar un comando de edición específico. Cuando sed encuentra algo que no se encuentra, realiza sus operaciones en cada línea del archivo.

El siguiente comando agrega una dirección principal al comando sed que usa:

  $ cat / etc / passwd |  sed '1d' |  more daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh bin : x : 2 : 2 : bin : / bin: / bin / sh sys : x : 3 : 3 : sys : / dev: / bin / sh sync : x : 4 : 65534 : sync : / bin: / bin / sync games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / backup sh : x : 34 : 34 : backup : / var / backups : / bin / sh $ 

Tenga en cuenta que el número 1 se agrega antes del comando de edición de eliminación. Esto le dice a sed que ejecute el comando para editar la primera línea del archivo. En este ejemplo, sed eliminará la primera línea de /etc/passwd e imprimirá el resto del archivo.

Rangos en direcciones Sed en Unix/Linux

Entonces, ¿si desea eliminar más de una línea de un archivo? Puede definir un rango de direcciones con sed de la siguiente manera:

  $ cat / etc / passwd |  sed '1, 5d' |  more games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / sh backup : x : 34 : 34 : backup : / var / backups : / bin / sh $ 

El comando anterior se aplicará a todas las filas desde la fila 1 hasta la fila 5. Así que elimine las primeras 5 filas.

Intenta entrenar en los siguientes rangos:

Rango Descripción '4,10d' Se elimina la línea que comienza de 4 a 10. '10, 4d 'Solo se elimina la décima línea porque sed no funciona en la dirección opuesta. '4, + 5d' Coincidirá con la línea 4 en el archivo, eliminará esta línea, continuará eliminando las siguientes 5 líneas y luego dejará de eliminar e imprimirá el resto del archivo. '2.5! D 'Eliminará todo excepto la línea 2 a la línea 5.' 1 ~ 3d 'eliminará la primera línea, pasará por las siguientes 3 líneas y luego eliminará la cuarta línea. Sed Continúe aplicando este modelo de eliminación hasta el final del archivo. '2 ~ 2d' Le dice a sed que elimine la segunda línea, vaya a la siguiente línea, elimine la siguiente línea y repita el paso anterior hasta que se lea el archivo. '4.10p' A partir de la línea 4 a la 10 impresa. '4, d' Esta es una sintaxis de error. ', 10d' Esta es una sintaxis de error.

Nota : Durante el uso pags acción que debes usar -norte para evitar repetir la impresión de líneas. Está intentando comprobar la diferencia entre los dos comandos siguientes:

  $ cat / etc / passwd |  sed - n '1,3p' 

Verifique el comando anterior sin usar la función -n de la siguiente manera:

  $ cat / etc / passwd |  sed '1,3p' 

Reemplace el comando (comando Unix) en Unix / Linux

El comando de reemplazo representado por s reemplaza cada cadena que especifique con cualquier otra cadena.

Para reemplazar una cadena con otra, necesita varias formas de decirle a sed dónde termina la primera cadena y comienza la cadena de reemplazo. Esto se hace tradicionalmente dividiendo 2 cadenas con una barra inclinada.

El siguiente comando reemplaza el primer evento en una fila desde la raíz cuerda s la cuerda de amrood .

  $ cat / etc / passwd |  sed 's / root / amrood /' amrood : x : 0 : 0 : root user : / root: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh . .... 

Es importante recordar que sed solo reemplaza el primer evento de una fila, si hay más de una fila en la cadena principal, solo se reemplazará la primera fila.

Para decirle a na sed que realice un reemplazo completo, agregue el carácter g al final del comando de la siguiente manera:

  $ cat / etc / passwd |  sed 's / root / amrood / g' amrood : x : 0 : 0 : amrood user : / amrood: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh bin : x : 2 : 2 : bin : / bin: / bin / sh sys : x : 3 : 3 : sys : / dev: / bin / sh .... .. 

Bandera de reemplazo en Unix / Linux

Hay una serie de usos útiles de la bandera que se pueden usar para agregar caracteres g y puede identificarla más de una vez.

Indicador DescripciónG Reemplazar todas las coincidencias (cadenas de reemplazo), no solo la primera coincidencia NÚMERO Reemplazar solo el NÚMERO correspondiente p Si se crea el reemplazo, imprimir espacio de muestra w NOMBRE DE ARCHIVO Si se crea el reemplazo, guarde el resultado en NOMBRE DE ARCHIVO. I o i Crea una coincidencia entre tipografía (mayúsculas y minúsculas) M o m En el modo normal de procesamiento de expresiones especiales ^ y $, esta marca hace que ^ coincida con una cadena vacía después de una nueva línea y $ corresponde a una cadena vacía antes de una nueva línea.

Use una cadena alternativa en Unix/Linux

Puede encontrarse reemplazando una cadena que incluye una barra inclinada. En este caso, puede definir otro operador proporcionando el carácter después de la letra s:

  $ cat / etc / passwd |  sed 's: / root: / amrood: g' amrood : x : 0 : 0 : amrood user : / amrood: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh 

En el ejemplo anterior, usamos el signo restrictivo: como en lugar de la barra inclinada (porque estamos tratando de encontrar) una raíz en lugar de una sola raíz.

Cambiar la posición del espacio en blanco en Unix / Linux

Use una cadena de reemplazo vacía para eliminar la cadena principal del archivo /etc/passwd:

  $ cat / etc / passwd |  sed 's / root // g' : x : 0 : 0 :: /: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh 

Encuentre un reemplazo en Unix / Linux

Si desea reemplazar la cadena sh con la cadena quiet solo en la décima línea, puede especificarla de la siguiente manera:

  $ cat / etc / passwd |  sed '10s / sh / quiet / g' root : x : 0 : 0 : root user : / root: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh bin : x : 2 : 2 : bin : / bin: / bin / sh sys : x : 3 : 3 : sys : / dev: / bin / sh sync : x : 4 : 65534 : sync : / bin: / bin / sync games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / sh backup : x : 34 : 34 : backup : / var / backups : / bin / quiet 

De la misma manera, para cambiar un rango de direcciones, puedes hacer el mismo trabajo:

  $ cat / etc / passwd |  sed '1.5s / sh / quiet / g' root : x : 0 : 0 : root user : / root: / bin / quiet daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / quiet bin : x : 2 : 2 : bin : / bin: / bin / quiet sys : x : 3 : 3 : sys : / dev: / bin / quiet sync : x : 4 : 65534 : sync : / bin: / bin / sync games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / sh backup : x : 34 : 34 : backup : / var / backups : / bin / sh 

Como puede ver en la salida, las primeras 5 filas de la cadena sh se han cambiado por la cadena tih, pero las otras filas no se tocan.

Comando de coincidencia de Unix/Linux

Utilizará la función p en paralelo con la función -n para imprimir todas las líneas coincidentes de la siguiente manera:

  $ cat testing |  sed - n '/ root / p' root : x : 0 : 0 : root user : / root: / bin / sh [ root @ ip - 72 - 167 - 112 - 17 amrood ] # vi testing root : x : 0 : 0 : root user : / root: / bin / sh daemon : x : 1 : 1 : daemon : / usr / sbin : / bin / sh bin : x : 2 : 2 : bin : / bin: / bin / sh sys : x : 3 : 3 : sys : / dev: / bin / sh sync : x : 4 : 65534 : sync : / bin: / bin / sync games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / sh backup : x : 34 : 34 : backup : / var / backups : / bin / sh 

Usar una expresión regular en Unix/Linux

Al hacer coincidir las plantillas, puede usar expresiones regulares que le brindan más flexibilidad.

Verifique el siguiente ejemplo, que corresponde a todas las líneas que comienzan con el daemon y luego las borran:

  $ cat testing |  sed '/ ^ daemon / d' root : x : 0 : 0 : root user : / root: / bin / sh bin : x : 2 : 2 : bin : / bin: / bin / sh sys : x : 3 : 3 : sys : / dev: / bin / sh sync : x : 4 : 65534 : sync : / bin: / bin / sync games : x : 5 : 60 : games : / usr / games : / bin / sh man : x : 6 : 12 : man : / var / cache / man : / bin / sh mail : x : 8 : 8 : mail : / var / mail : / bin / sh news : x : 9 : 9 : news : / var / spool / news : / bin / sh backup : x : 34 : 34 : backup : / var / backups : / bin / sh 

El siguiente es un ejemplo que eliminará todas las líneas que terminan en w :

  $ cat testing |  sed '/ sh $ / d' sync : x : 4 : 65534 : sync : / bin: / bin / sync 

La siguiente tabla enumera cuatro caracteres especiales que son muy útiles en las expresiones regulares:

Descripción del personaje ^ Coincide con el comienzo de las líneas. $ Coincide con el final de las filas. . Coincide con cada carácter individual. * Coincide con 0 o más eventos del personaje anterior. [chars] Coincide con cada carácter dado en caracteres (es un diseño de caracteres). Puede utilizar el carácter - para especificar una secuencia de caracteres.

Coincidencia de caracteres en Unix / Linux

Consulte la siguiente tabla para ver otras expresiones que explican el uso de metacaracteres. Por ejemplo, los siguientes ejemplos:

Descripción de la expresión / ac / Match filas que contienen cadenas como a + c, ac, abc, match y a3c. / a * c / Corresponde a las mismas cadenas que la cadena dada como ace, yacc y arctic. / [TT] él / Coincide con la cadena The y the. / ^ $ / Coincide con líneas en blanco. /^.*$/ Coincide con una línea completa, independientemente del orden. /*/ Corresponde a uno o más intervalos. / ^ $ / Coincide con líneas en blanco.

La siguiente es una tabla que enumera algunos de los juegos de caracteres más utilizados:

Descripción del escenario [az] Coincide con una letra. [AZ] Coincide con una letra de una letra. [a-zA-Z] Coincide con una letra. [0-9] Coincide con algunas aplicaciones. [a-zA-Z0-9] Coincide con un número o letra.

Palabras clave de clase de caracteres de Unix/Linux

Algunas palabras clave especiales suelen estar disponibles para las expresiones regulares, especialmente las utilidades de GNU que usan expresiones regulares.Esto es muy útil para Expression Sed Regulars cuando simplifican tareas y mejoran la legibilidad.

Por ejemplo, los caracteres de la A a la Z, así como los caracteres de la A a la Z, delegan una clase de caracteres como palabras clave. [[: alpha:]]

Usando la palabra clave de clase alfabética, este comando imprime solo líneas en el archivo /etc/syslog.conf, que comienza con un carácter alfabético.

  $ cat / etc / syslog .  conf |  sed - n '/ ^ [[: alpha:]] / p' authpriv . * / var / log / secure mail . * - / var / log / maillog cron . * / var / log / cron uucp , news .  crit / var / log / local7 spooler . * / var / log / boot .  log 

La siguiente tabla es una lista completa de palabras clave de clase de caracteres sed de GNU.

Descripción de la clase de símbolos. [[: alnum:]]Número alfabético [az AZ 0-9] [[: alpha:]]Alfabeto [az AZ] [[: blank:]]Caracteres de espacio (espacios o tabuladores) [[: cntrl:]]Señales de control [[: digit:]]Números [0-9] [[: graph:]]Todos los caracteres visibles (excepto los espacios en blanco) [[: lower:]]Letras minusculas [az] [[: print:]]Símbolos de impresión (caracteres que no son de control) [[: punct:]]Señales de auto-puntuación [[: space:]]Espacio en blanco [[: upper:]]Personajes principales [AZ] [[: xdigit:]]Dígitos hexadecimales [0-9 af AF]

Ayuda en Unix/Linux

Los supercaracteres & en sed representan el contenido de la plantilla correspondiente. Por ejemplo, suponga que tiene un archivo llamado phone.txt lleno de números de teléfono de la siguiente manera:

  5555551212 5555551213 5555551214 6665551215 6665551216 7775551217 

Desea crear un código de región (los primeros 3 dígitos) entre paréntesis para que sea más fácil de leer. Para hacer esto, puede usar el signo alternativo &, como:

  $ sed - e 's / ^ [[: digit:]] [[: digit:]] [[: digit:]] / (&) / g' phone .  txt ( 555 ) 5551212 ( 555 ) 5551213 ( 555 ) 5551214 ( 666 ) 5551215 ( 666 ) 5551216 ( 777 ) 5551217 

Aquí, en la sección de muestra, compara los primeros 3 dígitos y luego usa e intercambia los 3 dígitos entre paréntesis.

Use muchos comandos sed en Unix / Linux

Puede usar muchos comandos sed en el comando sed de la siguiente manera:

  $ sed - e 'command1' - e 'command2' . - e 'commandN' files 

Aquí, desde command1 hasta commandN, están los tipos de comandos sed discutidos anteriormente. Estos comandos se aplican a cada línea en una lista de archivos proporcionada por los archivos.

Usando la misma técnica, podemos escribir el número de teléfono de muestra anterior de la siguiente manera:

  $ sed - e 's / ^ [[: digit:]] {3} / (&) / g' - e 's /) [[: digit:]] {3} / & - / g' phone .  txt ( 555 ) 555 - 1212 ( 555 ) 555 - 1213 ( 555 ) 555 - 1214 ( 666 ) 555 - 1215 ( 666 ) 555 - 1216 ( 777 ) 555 - 1217 

Nota : En el ejemplo anterior, en lugar de repetir la palabra clave class [[: digit:]]3 veces, lo cambia a {3}, lo que significa que coincide con la expresión regular 3 veces por adelantado. Aquí suelo bajar, debe eliminarlo antes de ejecutar este comando.

Vínculos de retroceso en Unix / Linux

Súper personajes y son útil, pero más útil es la capacidad de definir áreas específicas de forma regular para que pueda reenviarlas para mover cadenas. Al definir partes específicas de expresiones regulares, puede revisar estas secciones con un carácter de referencia especial.

Para invertir una referencia, primero debe definir un área y luego revisar esa área. Para definir un área, inserte paréntesis en una barra invertida alrededor de cada área que le interese. La primera área la rodea con una barra invertida, luego avanza con 1, la segunda área con 2 y continúa.

Supongamos que phone.txt tiene los siguientes datos:

  ( 555 ) 555 - 1212 ( 555 ) 555 - 1213 ( 555 ) 555 - 1214 ( 666 ) 555 - 1215 ( 666 ) 555 - 1216 ( 777 ) 555 - 1217 

Ahora prueba el siguiente comando:

  $ cat phone .  txt |  sed 's /(.*))(.*-)(.*$)/ Area code: 1 Second: 2 Third: 3 /' Area code : ( 555 ) Second : 555 - Third : 1212 Area code : ( 555 ) Second : 555 - Third : 1213 Area code : ( 555 ) Second : 555 - Third : 1214 Area code : ( 666 ) Second : 555 - Third : 1215 Area code : ( 666 ) Second : 555 - Third : 1216 Area code : ( 777 ) Second : 555 - Third : 1217 

Nota : En el ejemplo anterior, cada expresión regular entre paréntesis se mencionará con 1, 2,. Aquí, para bajar, debes eliminarlos antes de ejecutar el comando.

Según Tutorialspoint

Artículo anterior: Seleccionar un bucle en Shell

Artículo siguiente: Fundamentos del sistema de archivos Unix/Linux

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
error: Content is protected !!