Acabei de encontrar um script bash. O que [[:space:]]
significa em um script bash? Por que o cólon duplo?
É, 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=+'/Within \[ and \],' man bash
vez de 32n
comandos ext :-).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?
Expressões de suporte POSIX
POSIX padrão
Nenhuma norma
sintaxe herdada (alguém pode encontrar referência a eles?)
Você pode encontrar mais informações aqui: wiki
fonte
[[:ascii:]]
E[[:word:]]
não são POSIX classes (que parecem serbash
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 BashTã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):
ou um regex (Bash):
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
esed
também, e são descritas, por exemplo, na página de manual do Linuxregex(7)
fonte