Estoy eliminando palabras vacías de un texto, aproximadamente usando este código
Tengo lo siguiente
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
Estoy esperando el resultado:
extensions
pero me sale el (creo que incorrecto)
file
extensions
Es como si la palabra file
se hubiera omitido en el archivo de palabras clave. Ahora aquí está la parte fría: si modifica el archivo de palabras vacías, cambiando la palabra / carta i
en la primera línea, a cualquier otra letra ASCII, aparte de f
, i
, l
, e
, a continuación, el mismo comando grep me da un resultado diferente y correcta de extensions
.
¿Qué está pasando aquí y cómo lo soluciono?
Estoy usando grep (BSD grep) 2.5.1-FreeBSD en un Mac OSX GNU bash, versión 4.4.12 (1)
-x
interruptor para regex de línea en lugar de-w
para word? Sin embargo, creo que el-F
interruptor cancelará cualquiera de ellos, o viceversa.i
patrón en el segundo patrón en lugar del primer patrón en elstopwords
archivo también altera el comportamiento.grep
ni con GNUgrep
3.1.Respuestas:
Este fue un error
bsdgrep
relacionado con una variable que rastrea la parte de la línea actual que aún se escanea y que se sobrescribe con llamadas sucesivas al motor de coincidencia de expresiones regulares cuando hay varios patrones involucrados.arreglo local
Puede evitar esto hasta cierto punto si no utiliza la
-w
opción, que se basa en esta variable para el funcionamiento correcto y, por lo tanto, falla, sino que usa las extensiones de expresión regular que coinciden con el principio y el final de las palabras, haciendo que sustopwords
archivo se vea así:Esta solución también requerirá que no use la
-F
opción.Tenga en cuenta que los componentes de expresión regular documentados
[[:<:]]
y[[:>:]]
que elre_format
manual le informa no funcionarán aquí. Esto se debe a que la biblioteca de expresiones regulares que se compilabsdgrep
tiene la compatibilidad de compatibilidad de expresiones regulares GNU activada. Este es otro error, que, según los informes, se ha solucionado.servicio fijo
Este error se solucionó a principios de este año. La solución aún no ha llegado a los sabores ESTABLE o LIBERACIÓN de FreeBSD, pero según los informes está en ACTUAL.
Para obtener esto en la versión de MacOS
grep
, que se deriva de FreeBSDbsdgrep
, consulte a Apple. ☺Otras lecturas
fuente
Este código:
produce:
En un sistema como:
Más detalles sobre cgrep, disponible a través de brew, y de sourceforge:
salud, drl
fuente