El comando grep
imprimirá 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 grep
para atrapar solo el word
?
Respuesta1
Así para Word, usandoperlaexpresió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 awk
manera:
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 grep
salida tr
para eliminar todas las apariciones del carácter *
:
grep -x '\*\*[^*]*\*\*' | tr -d '*'
También recomiendo que use la -x
bandera 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.
sed
alternativa
También puedes aprovechar la p
bandera de sed para hacer coincidir, reemplazar e imprimir como un solo comando:
sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'