Acabo de encontrar un script bash. ¿Qué [[:space:]]
significa en un script bash? ¿Por qué el doble colon?
De hecho, está en el manual de bash, pero ayuda a saber lo que está buscando, lo que no es útil si no sabe lo que está viendo. Si buscas [[
te distraerás con la [[ expression ]]
sección de expresión condicional. Además, la búsqueda :space:
te aterriza en dos ejemplos en la misma sección. Puede seguir la ruta de navegación en ese ejemplo:
Por ejemplo, lo siguiente coincidirá con una línea (almacenada en la línea variable del shell) si hay una secuencia de caracteres en el valor que consiste en cualquier número, incluido cero, de caracteres de espacio, cero o una instancia de 'a', luego un 'si':
[[ $line =~ [[:space:]]*?(a)b ]]
... a partir de la cual podría juntar que la [[:space:]]
porción correspondía a "caracteres espaciales", pero podría ser perdonado por pensar que era solo un carácter espacial literal y no una clase completa de caracteres, que es lo que representa.
Si (¿sucede?) Busca la cadena " space"
(es decir, un espacio seguido de la palabra "espacio") en el manual de bash en línea , hay "solo" unas 32 coincidencias por recorrer. Alrededor del décimo estará aquí:
Dentro de '[' y ']', las clases de caracteres se pueden especificar utilizando la sintaxis [: class:], donde class es una de las siguientes clases definidas en el estándar POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Una clase de personaje coincide con cualquier personaje que pertenezca a esa clase.
Lo que luego lo llevaría al estándar POSIX donde podría buscar el término "clase de caracteres" y encontrar
wctype, wctype_l: define la clase de caracteres , que te lleva hasta:
Las funciones wctype () [CX] [Opción de inicio] y wctype_l () [Opción de finalización] determinarán los valores de wctype_t de acuerdo con las reglas del conjunto de caracteres codificados definidos por la información del tipo de caracteres en la configuración regional actual [CX] [Opción de inicio] o en la configuración regional representada por configuración regional, [Opción Fin] respectivamente (categoría LC_CTYPE).
Si luego seguiste el enlace setlocale , finalmente llegarías a tu respuesta real, en la sección Configuración regional :
espacio
Defina caracteres para clasificarlos como espacios en blanco. En el entorno local POSIX, se
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
incluirá exactamente .En un archivo de definición de configuración regional, no se especificará ningún carácter para las palabras clave superior, inferior, alfa, dígito, gráfico o xdigit. La
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
del conjunto de caracteres portátil y los caracteres incluidos en el espacio en blanco de la clase se incluyen automáticamente en esta clase.
LESS=+'/Within \[ and \],' man bash
lugar de 32n
comandos ext :-).less +"$cmd"
, así que gracias por eso.[]
es independiente de lo interno[]
. Traté (!) De encontrar un camino desde la pregunta hasta la respuesta sin saber demasiado sobre cuál era la respuesta, aunque me costó adivinar con suerte :)No es solo para Bash, es parte de la notación POSIX.
¿Qué es POSIX?
Expresiones de soporte POSIX
POSIX estándar
Ninguna norma
sintaxis heredada (¿alguien puede encontrar referencias a estos?)
Puedes encontrar más información aquí: wiki
fuente
[[:ascii:]]
Y[[:word:]]
no son POSIX clases (que parecen serbash
específica de), y no puedo encontrar[[:<:]]
ni[[:>:]]
tampoco. Una mejor referencia puede haber sido pubs.opengroup.org/onlinepubs/9699919799/basedefs/…[[:ascii:]]
y[[:word:]]
no son clases POSIX estándar. para[[:<:]]
y[[:>:]]
, no puedo encontrar ninguna referencia, pero es lo mismo\b
. en.wikipedia.org/wiki/Regular_expression#Character_classes[[:<:]]
y afirma que: Esta es una extensión, compatible pero no especificada por POSIX 1003.2[[:<:]]
está en FreeBSD también, con la misma salvedad que tiene PostgreSQL: freebsd.org/cgi/...[[:ascii:]]
y[[:word:]]
del trabajo del curso en Bash en concordancia con el modelo, pero no en expresiones regulares (al menos en mi sistema, creo Bash utiliza la biblioteca de expresiones regulares del sistema). Bah.En expresiones regulares y nombres de archivo globos / patrones de shell, el
[...]
construcción coincide con cualquier carácter de los que figuran entre paréntesis. Dentro de esos corchetes, se pueden usar varias clases de caracteres de caracteres estándar con nombre . Uno de ellos es[:space:]
, que coincide con los espacios en blanco (como\s
en las expresiones regulares de Perl). Ver, por ejemplo, Coincidencia de patrones en el manual de BashEntonces,
[[:space:]]
es parte de una expresión regular o coincidencia de patrón, una que coincide solo con espacios en blanco.Por ejemplo, una coincidencia de patrón (shell estándar, no específico de Bash):
o una expresión regular (Bash):
Tenga en cuenta que aunque las expresiones entre paréntesis
[...]
funcionan de la misma manera en expresiones regulares y patrones de shell, generalmente no son lo mismo. (case
y[[ string == pattern ]]
usa coincidencias de patrones,[[ string =~ regex ]]
usa expresiones regulares).Las expresiones regulares tampoco son específicas de shell, se usan en eg
awk
ysed
también, y se describen, por ejemplo, en la página de manual de Linuxregex(7)
fuente