Te traemos la solución a esta dificultad, o por lo menos eso esperamos. Si tienes alguna inquietud puedes dejarlo en el apartado de preguntas, que con placer te responderemos
Solución:
Esto se debe a que está utilizando el guión dentro de otros caracteres, por lo que grep
lo entiende como un rango, que pasa a ser inválido.
básicamente estás haciendo
grep "[-']" file
Esto es interpretado por grep
a medida que proporciona una gama de caracteres para verificar, como por ejemplo grep "[a-z]" file
. Pero el rango de para
'
no es válido, de ahí el error.
¿Y por qué el otro está funcionando? Puede que te estés preguntando. Porque lo que estás haciendo es:
grep "['-]" file
En este caso, está buscando el personaje '
, o
-
en el archivo.
Ver otro ejemplo de ello, donde quiero encontrar personajes a
, -
o 3
en un dado string:
$ echo "23-2" | grep -o '[a-3]'
grep: Invalid range end
$ echo "23-2" | grep -o '[a3-]'
3
-
$ echo "23-2" | grep -o '[a3-]'
3
-
Así que el problema subyacente es que estás usando una expresión some character
+ -
+ another character
dentro de una []
bloque e intenta ser leído como el rango de caracteres entre some character
y another character
.
¿Cómo puedes resolverlo?
Si quieres hacer coincidir el personaje -
entre otros, solo agréguelo en los bordes de la expresión: como primer o último elemento.
Desde man grep
:
Clases de caracteres y expresiones de paréntesis
Una expresión de paréntesis es una lista de caracteres encerrados por [ and ]. Coincide con cualquier carácter individual en esa lista; si el primer carácter de la lista es el signo de intercalación ^, entonces coincide con cualquier carácter que no esté en la lista. Por ejemplo, la expresión regular [0123456789] coincide con cualquier dígito único.
Dentro de una expresión entre paréntesis, una expresión de rango consta de dos caracteres separados por un guión. Coincide con cualquier carácter individual que se clasifique entre los dos caracteres, inclusive, utilizando la secuencia de clasificación y el conjunto de caracteres de la configuración regional. Por ejemplo, en la configuración regional predeterminada de C, [a-d] es equivalente a [abcd]. Muchas configuraciones regionales ordenan los caracteres en el orden del diccionario, y en estas configuraciones regionales [a-d] típicamente no es equivalente a [abcd]; puede ser equivalente a [aBbCcDd], por ejemplo. Para obtener la interpretación tradicional de las expresiones entre paréntesis, puede utilizar la configuración regional C estableciendo la variable de entorno LC_ALL en el valor C.
Finalmente, ciertas clases de caracteres con nombre están predefinidas dentro de las expresiones entre paréntesis, como sigue. Sus nombres se explican por sí mismos y son [:alnum:], [:alpha:], [:cntrl:], [:digit:],
[:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:]y [:xdigit:]. Por ejemplo, [[:alnum:]]significa la clase de caracteres de números y letras en la configuración regional actual. En la configuración regional C y la codificación del juego de caracteres ASCII, esto es lo mismo que [0-9A-Za-z]. (Tenga en cuenta que los corchetes en estos nombres de clase son parte de los nombres simbólicos y deben incluirse además de los corchetes que delimitan la expresión entre corchetes). La mayoría de los metacaracteres pierden su significado especial dentro de las expresiones entre corchetes. Para incluir un literal ]colóquelo primero en la lista. De manera similar, para incluir un ^ literal, colóquelo en cualquier lugar menos primero. Finalmente, para incluir un literal, colóquelo en último lugar.
Para evitar el valor del rango, puede usar fgrep
.