GNU/Linux >> Tutoriales Linux >  >> Linux

Expresión regular para encontrar caracteres dobles en Bash

Esto realmente son dos preguntas, y deberían haberse dividido. Pero como las respuestas son relativamente simples, las pondré aquí. Estas respuestas son para GNU grep específicamente.

a) egrep es lo mismo que grep -E . Ambos indican que se deben usar "Expresiones regulares extendidas" en lugar de grep Expresiones regulares predeterminadas. grep requiere las barras invertidas para expresiones regulares simples.

Desde el man página:

Expresiones regulares básicas y extendidas

En las expresiones regulares básicas, los metacaracteres ? , + , { , | , ( y ) pierden su significado especial; en su lugar, use las versiones con barra invertida \? , \+ , \{ , \| , \( y \) .

Ver el man página para obtener detalles adicionales sobre convenciones históricas y portabilidad.

b) Utilice egrep '(.)\1{N}' y reemplaza N con el número de caracteres que deseas reemplazar menos uno (ya que el punto coincide con el primero). Entonces, si desea hacer coincidir un carácter repetido cuatro veces, use egrep '(.)\1{3}' .


Esto buscaría 2 o más ocurrencias del mismo carácter:

grep -E '(.)\1+' file

Si su awk tiene la opción -o, esto imprimiría cada coincidencia en una nueva línea.

grep -Eo '(.)\1+' file

Para encontrar coincidencias con exactamente 3 coincidencias:

grep -E '(.)\1{2}' file

O 3 o más:

grep -E '(.)\1{2,}' file

etc..

editar

En realidad, @stephane_chazelas tiene razón sobre las referencias anteriores y -E. Me había olvidado de eso. Lo probé en BSD grep y GNU grep y funciona allí, pero no en otros greps. Tendrías que usar una de las siguientes versiones..

Versiones regulares de grep:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

El -o la opción tampoco es grep estándar por cierto (probablemente si su grep entiende -o también puede hacer la referencia posterior).

Nota :grep -E '(.)\1{2,}' archivo y grep '\(.\)\1\{2\}' El archivo está mal como lo indicó Alexis y debe ignorarse.


En primer lugar, gracias a todos por sus comentarios de apoyo y sugerencias. Resulta que ya estaba bastante cerca de la respuesta.

El problema principal se trataba de:

¿Existe una forma sencilla de buscar n? ocurrencias del mismo carácter, p. aa , tttttt

Respuesta corta :

Las siguientes [variaciones de] comandos repetirán a al menos una e infinitas veces

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

o, con las expresiones regulares de GNU disponiblesgrep a\+


El número de repeticiones se establece entre llaves, a través del patrón {min,max}{n} repetir exactamente n veces, {n,} repetir al menos n veces y {n,m} repetir al menos n pero a lo sumo m veces.

Así, como consecuencia, se planteó la cuestión secundaria :

¿La necesidad de establecer retrocesos está ligada al comando Iuse?

Respuesta corta :Sí, el uso de barras invertidas depende de si se usa grep o egrep

  • grep :barra invertida activa metacaracteres [usa expresiones regulares básicas]
  • egrep barra invertida de -activa metacaracteres [usa expresiones regulares extendidas]

Como esta es la respuesta corta, quiero proporcionar a aquellos que se encontraron con problemas similares, agregué mi resumen básico de lo que aparentemente uno debe tener en cuenta, trabajando con grep y egrep .



Expresiones regulares básicas, extendidas y GNU

Expresiones regulares básicas

Usado en grep , ed y sed comando

Las características básicas del conjunto de expresiones regulares son:

  • La mayoría de los metacaracteres, p. ? [ . \ ) etc. se activan a través de una barra invertida. Si no hay una barra invertida, se tomarán como (parte del) término de búsqueda.
  • ^ $ \< y \> son compatibles sin una barra invertida
  • Sin caracteres abreviados [\b , \s , etc]

GNU Las expresiones regulares básicas se suman a estas

  • \? repetir el carácter cero o una vez (c\? coincide con c y cc ) y es una alternativa para \{0,1\}
  • \+ repetir un carácter al menos una vez (c\+ coincide con cc , cccccccc etc.) y es una alternativa para \{1,\}

  • \| es compatible (por ejemplo, grep a\|b buscará a o b

grep -E permite que el comando use todo el conjunto de expresiones regulares extendidas:


Expresiones regulares extendidas [ERE]

Usado en egrep , awk y emacs es el conjunto básico más algunas funciones.

  • Los metacaracteres se desactivan mediante una barra invertida
  • Sin referencias anteriores
  • más:muchas de las expresiones regulares mágicas generalmente pueden hacer por uno

GNU Ampliar Expresiones Regulares

agrega las siguientes características

  • clases de taquigrafía
  • cuantificadores

Los dos enlaces lo dirigirán a regular-expressions.info que, además del increíble soporte que tengo aquí, realmente me ayudó mucho.


Linux
  1. Usando Bash para la automatización

  2. Tr analógico para caracteres Unicode?

  3. Bash:¿Expresiones regulares en sustitución?

  4. fundamentos de grep

  5. 6 ejemplos de expresiones condicionales de Bash (-e, -eq, -z, !=, [, [[ ..)

Golpe para bucle

Expresión de secuencia Bash (rango)

Expresiones regulares en Grep (Regex)

Cómo hacer Grep para múltiples cadenas y patrones

Tutorial de secuencias de comandos de Bash para principiantes

Tutorial de Bash Heredoc para principiantes