Extraer un elemento de líneas de un archivo de texto

Extraer un elemento de líneas de un archivo de texto

El comando grepimprimirá una línea cuando la línea contenga una cadena que coincida con una expresión, lo cual 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 la mayor parte del contenido.

¿Cómo usarlo greppara atrapar solo el word?

Respuesta1

Así para Word, usandoexpresión regular ( -P):

grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file

Producción :

word

Así para las palabras:

grep -oP '^\s*\d+\.\s*\K\w+' file

Producción :

Definition
Usage
Others

Respuesta2

Hay varias herramientas disponibles que se pueden usar para extraer palabras, aquí hay una versión implementada en sed:

 sed '/^\*\*/!d' <your_file

Este comando coincidirá con cada línea de su archivo que comience con **y la imprimirá. Las otras líneas se eliminarán de la salida. Si también deseas eliminar las estrellas puedes extender el comando a este:

sed '/^\*\*/!d;s/\*//g' <your_file

Este comando, además, eliminará todos *los caracteres de la línea antes de imprimirla.

Respuesta3

Con awkmanera:

awk -F'*\\*' 'NF>2{print $2}' infile

entrada de prueba de muestra:

*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**

La salida:

word

Respuesta4

Si no le importa utilizar herramientas adicionales, una solución muy simple sería realizar un posfiltrado de la grepsalida trpara eliminar todas las apariciones del carácter *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'

También recomiendo que use la -xbandera de GNU grep como se indicó anteriormente para hacer coincidir solo líneas completas y no detectar accidentalmente **word**que aparecen rodeadas por otro texto en la misma línea. Esto también puede acelerar el proceso de coincidencia de patrones, ya que ahora puede descartar muchas coincidencias potenciales desde el principio.

sedalternativa

También puedes aprovechar la pbandera de sed para hacer coincidir, reemplazar e imprimir como un solo comando:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'

información relacionada