Habilitar grep para que coincida exactamente con la expresión regular

3

Habilite el comando 'grep' para devolver la expresión regular que coincide exactamente.

El comando grep imprimirá una línea cuando la línea contenga una cadena que coincida con una expresión, lo que no es útil para buscar contenido específico. Por ejemplo, tengo archivos de vocabulario con formato

    **word**
    1. Definition:
    2. Usage
    3. Others

Me gustaría recuperar todas las palabras para hacer una lista de palabras dentro de los archivos

    grep '\*\*[^*]*\*\*'

Devuelve grandes cantidades de contenido.

¿Cómo habilitar grep para capturar solo la 'palabra'?

    
pregunta JawSaw 26.03.2018 - 17:43

2 respuestas

3

Usa awk .

Este comando "extraerá" una lista masiva de palabras asumiendo que está en el formato que especificó anteriormente:

awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' <filename>

Ejemplo:

Para este ejemplo, supongamos que tenemos un archivo de texto llamado words.txt con el siguiente contenido:

**test**
1. Definition:
2. Usage
3. Others

**foo**
1. Definition:
2. Usage
3. Others

**bar**
1. Definition:
2. Usage
3. Others


$ awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' words.txt

test
foo
bar

Lo que está haciendo

  • /\*\*/,/\*\*/ Este es el rango de patrón . Podría haber hecho esto buscando el primer conjunto de asteriscos ( /\*\* ) y haberlo hecho, pero utilicé un rango completo para completar. Un método no es más "correcto" que el otro.

  • {print substr($0, 3, length($0)-4)}' Esto imprime el subsring (de la cadena **word** ) comenzando en el tercer carácter, con una longitud de la cadena completa ( length($0) ) menos cuatro caracteres (los cuatro asteriscos).

  • <filename> Este es el archivo de entrada para procesar el comando awk

respondido por el Allan 26.03.2018 - 21:54
0

Aquí está la salida que obtuve usando un archivo de ejemplo con el contenido que tomé prestado de Allan, junto con su comando grep :

Alprincipio,penséquenohabíaningúnproblema,yaqueparecedevolverlaslíneasquecontienenlapalabra,yasumíquequeríasmantenerel**,dadoloexplícitamenteintencionalquepareceestarenlacadenadeexpresiónregular.

Pero,habiendoleídotupreguntaconmáscuidado,ahoraveoquenoquieresel**,ysoloquierola(s)palabra(s)contenida(s)dentrodel**.

Parahaceresto,aúnpuedesusartumismocomandogrep,luegopasarloatrparaqueelimineel**:

grep'\*\*[^*]*\*\*'/path/to/file|tr-d'*'

    
respondido por el CJK 29.03.2018 - 23:20

Lea otras preguntas en las etiquetas