Expresión regular para encontrar caracteres dobles en Bash

10

Estoy buscando una expresión regular que encuentre todas las apariciones de caracteres dobles en un texto, una lista, etc. en la línea de comando (Bash).

Principal Pregunta : ¿Hay una manera sencilla para buscar secuencias como aa, ll, ttttt, etc, donde se define una expresión regular que busca n ocurrencias del mismo carácter con? Lo que estoy buscando es lograr esto en un nivel muy muy básico. En la línea de comando. En un Shell de Linux.

Después de bastante investigación llegué a las siguientes respuestas, y las preguntas resultantes de ellas, por lo que me dieron una pista de dónde podría estar la solución. Pero:

a) (e) grep y el problema de la barra invertida

  • grep 'a\{2\}' busca aa
  • egrep'a{2}' busca aa

Pregunta: ¿La necesidad de establecer contragolpes está realmente vinculada al comando que uso? Si es así, ¿alguien puede darme una pista de qué más se debe tener en cuenta al usar (e) grep aquí?

b) Encontré esta respuesta aquí para mi pregunta, aunque no es exactamente lo que estaba buscando:

grep -E '(.)\1' filenamebusca entradas con el mismo carácter que aparecen más de una vez, pero no pregunta con qué frecuencia . Esto está cerca de lo que estoy buscando, pero todavía quiero establecer una serie de repeticiones.

Probablemente debería dividir esto en dos o más preguntas, pero no quiero inundar este increíble sitio aquí.

PD: Otra pregunta, posiblemente fuera de tema, pero: ¿es in, inside, ato on the shell. ¿Y es on the command linecorrecto?

erch
fuente

Respuestas:

8

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

a) egrepes lo mismo que grep -E. Ambos indican que se deben usar "Expresiones regulares extendidas" en lugar de greplas Expresiones regulares predeterminadas. greprequiere las barras diagonales inversas para expresiones regulares simples.

De la manpágina:

Expresiones regulares básicas vs extendidas

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

Consulte la manpágina para obtener detalles adicionales sobre convenciones históricas y portabilidad.

b) Use egrep '(.)\1{N}'y reemplace Ncon el número de caracteres que desea reemplazar menos uno (ya que el punto coincide con el primero). Entonces, si quieres hacer coincidir un personaje repetido cuatro veces, úsalo egrep '(.)\1{3}'.

depquid
fuente
Al leer la página del manual, debo haber malinterpretado o malinterpretado realmente la parte que señaló. Cuando trabajé en algunos tutoriales de expresiones regulares, no había indicios de tal comportamiento que se esperara. Pensé que la expresión regular significa algo en un nivel tan básico que la mayoría de las aplicaciones están trabajando con el mismo conjunto de símbolos. De nuevo, me demostró que estaba equivocado. ¡Gracias por tu ayuda! Esto realmente me ayudó.
erch
También es bastante confuso leer " siempre use la barra invertida para tomar el significado especial de caracteres como., +, Etc. " y luego descubrir que aparentemente lo contrario es la regla con el comando más básico.
erch
@ cellar.dweller ¡Es confuso! Gran parte del razonamiento es histórico. Estoy más familiarizado con la forma Extendida, por lo que tengo la costumbre de usar siempre egrepsi necesito expresiones regulares (en lugar de solo una simple coincidencia de cadenas) para no tener que preocuparme por recordar las diferencias entre greplos dos tipos de expresiones regulares.
depquid
44
Tenga en cuenta que los ERE estándar no admiten referencias inversas, mientras que los BRE estándar sí. Entonces grep '\(.\)\1\{3\}'es estándar, grep -E '(.)\1{3}'no lo es.
Stéphane Chazelas
7

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

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

Si su awk tiene la opción -o, esto lo imprimirá cada partido 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 está en otros greps. Debería usar una de las versiones a continuación.

Versiones regulares de grep:

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

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

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

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

La -oopción tampoco es grep estándar BTW (probablemente si su grep entiende -o también puede hacer la referencia inversa).


Nota : el grep -E '(.)\1{2,}'archivo y el grep '\(.\)\1\{2\}'archivo son incorrectos como lo indicó alexis y deben ignorarse.

Escrutador
fuente
Gracias hasta ahora. Pero: ¿estoy en lo cierto al decir que sin la -Eopción grepno haría mucho? ¡Esto explicaría bastante, por ejemplo, por qué perdí tanto tiempo buscando dónde me equivoqué!
erch
Sin la opción -E, puede hacer lo mismo en este caso, pero necesitaría escapar más y no hay +operador. También publicaré ejemplos.
Scrutinizer
Una pequeña corrección: grep -E '(.)\1{2}'no exactamente "Encuentra coincidencias con exactamente 3 coincidencias". Si bien coincidirá exactamente con tres caracteres idénticos, pueden incrustarse en una cadena repetida más larga; por ejemplo, coincidirá en la cadena de 5 símbolos AAAAA. (Y si hay 6 o más símbolos consecutivos, coincidirá más de una vez).
alexis
Sí, tiene toda la razón, eso no funciona según lo previsto, de hecho, no es posible así ..
Escrutinizador
3

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

El problema principal era sobre:

¿Hay una manera simple de buscar n ocurrencias del mismo personaje, por ejemplo aa,tttttt

Respuesta corta :

Los siguientes [variaciones de] comandos se repetirán aal menos una e infinitas veces

grep 'a\{1,}

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

egrep a{1,}

o con GNU Expresiones regulares disponibles grep a\+


El número de repeticiones se establece dentro de las llaves, a través del patrón {min,max}{n}repetir exactamente las nveces, {n,}repetir al menos nveces y {n,m}repetir al menos npero en la mayoría de las mveces.

Por lo tanto, como consecuencia, planteó la cuestión secundaria :

¿La necesidad de establecer barras invertidas está vinculada al comando que uso?

Respuesta corta : Sí, el uso de barras invertidas depende de si uno usa grepoegrep

  • grep: la barra diagonal inversa activa metacaracteres [utiliza expresiones regulares básicas]
  • egrepbarra invertida de -activates metacaracteres [usos expresiones regulares extendidas]

Como esta es la respuesta corta, quiero proporcionarles a aquellos que se encontraron con problemas comparables, agregué mi resumen básico de lo que aparentemente uno tiene que tener en cuenta, trabajando con grepy egrep.




Expresiones regulares básicas, extendidas y GNU

Expresiones Regulares Básicas

Utilizado en grep, edy sedcomandos

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

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

Las expresiones regulares básicas de GNU se suman a estas

  • \?repite el carácter cero o una vez ( c\?coincide cy cc) y es una alternativa para\{0,1\}
  • \+repite un personaje al menos una vez ( c\+coincidencias cc, ccccccccetc.) y es una alternativa para\{1,\}

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

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


Expresiones regulares extendidas [ERE]

Se utiliza en egrep, awky emacses el conjunto básico más algunas características bastante.

  • Los metacaracteres se desactivan mediante una barra invertida
  • No hay referencias posteriores
  • de lo contrario: muchas de las expresiones regulares mágicas generalmente pueden hacer por uno

GNU Extendnd Expresiones regulares

agrega las siguientes características

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

erch
fuente