Respostas:
É, de fato, no manual do bash, mas ajuda a saber o que você está procurando, o que não é útil se você não souber o que está procurando. Se você pesquisasse, [[
seria distraído pela [[ expression ]]
seção de expressão condicional. Além disso, procurar por :space:
você em dois exemplos na mesma seção. Você pode seguir a trilha de navegação nesse exemplo:
Por exemplo, o seguinte corresponderá a uma linha (armazenada na linha variável do shell) se houver uma sequência de caracteres no valor que consiste em qualquer número, incluindo zero, de caracteres de espaço, zero ou uma instância de 'a' e, em seguida, um 'b':
[[ $line =~ [[:space:]]*?(a)b ]]
... a partir do qual você pode concluir que a [[:space:]]
parte corresponde a "caracteres do espaço", mas pode ser perdoado por pensar que era apenas um caractere de espaço literal e não uma classe inteira de caracteres, que é o que ela representa.
Se você (por acaso?) Procurar a string " space"
(ou seja, um espaço seguido pela palavra "space") no manual do bash online , existem "apenas" cerca de 32 correspondências para percorrer. Sobre o décimo estará aqui:
Dentro de '[' e ']', as classes de caracteres podem ser especificadas usando a sintaxe [: class:], em que class é uma das seguintes classes definidas no padrão POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Uma classe de personagem corresponde a qualquer caractere pertencente a essa classe.
O que levaria você ao padrão POSIX onde você poderia procurar o termo "classe de caracteres" e encontrar
wctype, wctype_l - define a classe de caractere , que leva você até:
As funções wctype () [CX] [Option Start] e wctype_l () [Option End] devem determinar valores de wctype_t de acordo com as regras do conjunto de caracteres codificados definido pelas informações do tipo de caractere no código de idioma atual [CX] [Option Start] ou na localidade representada pela localidade, [Option End], respectivamente (categoria LC_CTYPE).
Se você seguisse o link setlocale , finalmente chegaria à sua resposta real, na seção Localidade :
espaço
Defina caracteres a serem classificados como caracteres de espaço em branco. No código do idioma POSIX, exatamente
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
deve ser incluído.Em um arquivo de definição de localidade, nenhum caractere especificado para as palavras-chave superior, inferior, alfa, dígito, gráfico ou xdigit deve ser especificado. O
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
conjunto de caracteres portáteis e todos os caracteres incluídos no espaço em branco da classe são incluídos automaticamente nessa classe.
less +"$cmd"
, então obrigado por isso.
[]
é independente do interior []
. Eu tentei (!) Encontrar um caminho da pergunta para a resposta sem saber muito sobre qual era a resposta, embora tenha sido difícil adivinhar :)
Não é apenas para o Bash, é parte da notação POSIX.
O que é o POSIX?
POSIX ou "Interface do sistema operacional portátil para uniX" é uma coleção de padrões que definem algumas das funcionalidades que um sistema operacional (UNIX) deve suportar. Um desses padrões define dois tipos de expressões regulares.
Expressões de suporte POSIX
As expressões de colchete POSIX são um tipo especial de classe de caractere. As expressões de colchete POSIX correspondem a um caractere de um conjunto de caracteres, assim como as classes regulares de caracteres.
POSIX padrão
[[:alnum:]] Alphanumeric characters
[[:alpha:]] Alphabetic characters
[[:blank:]] Space and tab
[[:cntrl:]] Control characters
[[:digit:]] Digits
[[:graph:]] Visible characters (anything except spaces and control characters)
[[:lower:]] Lowercase letters
[[:print:]] Visible characters and spaces (anything except control characters)
[[:punct:]] Punctuation (and symbols).
[[:space:]] All whitespace characters, including line breaks
[[:upper:]] Uppercase letters
[[:xdigit:]] Hexadecimal digits
Nenhuma norma
[[:ascii:]] ASCII characters
[[:word:]] Word characters (letters, numbers and underscores)
sintaxe herdada (alguém pode encontrar referência a eles?)
[[:<:]] Start of Word
[[:>:]] End of Word
Você pode encontrar mais informações aqui: wiki
[[:ascii:]]
E [[:word:]]
não são POSIX classes (que parecem ser bash
espec�ico), e eu não consigo encontrar [[:<:]]
nem [[:>:]]
tanto. Uma referência melhor pode ter sido pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
[[:ascii:]]
e [[:word:]]
não há classes POSIX padrão. para [[:<:]]
e [[:>:]]
, não consigo encontrar nenhuma referência, mas é o mesmo \b
. en.wikipedia.org/wiki/expression_expression#Character_classes
[[:<:]]
e afirma que: Esta é uma extensão compatível com, mas não especificada, pelo POSIX 1003.2
[[:<:]]
também está no FreeBSD, com a mesma ressalva que o PostgreSQL: freebsd.org/cgi/…
[[:ascii:]]
e [[:word:]]
de trabalho do curso em Bash na correspondência de padrão, mas não em expressões regulares (pelo menos no meu sistema, eu acho Bash usa biblioteca regex do sistema). Bah.
Em expressões regulares e padrões de globs / shell de nome de arquivo, a [...]
construção corresponde a qualquer caractere daqueles listados entre colchetes. Dentro desses colchetes, várias classes de caracteres de caractere padrão nomeadas podem ser usadas. Um deles é o [:space:]
que corresponde aos caracteres de espaço em branco (como \s
nas expressões regulares do Perl). Veja por exemplo Correspondência de Padrões no manual do Bash
Tão, [[:space:]]
faz parte de uma expressão regular ou correspondência de padrões, que corresponde apenas a espaços em branco.
Por exemplo, uma correspondência de padrão (shell padrão, não específico do Bash):
case $var in
*[[:space:]]*) echo "'$var' contains whitespace";;
esac
ou um regex (Bash):
if [[ $var =~ [[:space:]] ]]; then
echo "'$var' contains whitespace"
fi
Observe que, embora as expressões entre colchetes [...]
funcionem da mesma maneira em expressões regulares e padrões de shell, elas geralmente não são as mesmas. ( case
e [[ string == pattern ]]
use correspondências de padrões, [[ string =~ regex ]]
use regexes.)
Expressões regulares também não são específicas do shell, elas são usadas, por exemplo, awk
e sed
também, e são descritas, por exemplo, na página de manual do Linuxregex(7)
LESS=+'/Within \[ and \],' man bash
vez de 32n
comandos ext :-).