Qual é o significado de [[: space:]] no bash?

23

Acabei de encontrar um script bash. O que [[:space:]]significa em um script bash? Por que o cólon duplo?

geraldin
fonte

Respostas:

35

É, 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.

Jeff Schaller
fonte
1
Mais fácil encontrar a correspondência manual com em LESS=+'/Within \[ and \],' man bashvez de 32 ncomandos ext :-).
Isaac
5
@ Isaac Acho que o objetivo é ensinar o homem a pescar. Dito isto, eu não sabia less +"$cmd", então obrigado por isso.
JoL
3
Na verdade, eu respondi dada a perspectiva do OP; eles poderiam ser perdoados por não entenderem que o exterior []é 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 :)
Jeff Schaller
17

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

Nima
fonte
1
[[:ascii:]]E [[:word:]]não são POSIX classes (que parecem ser bashespec�ico), e eu não consigo encontrar [[:<:]]nem [[:>:]]tanto. Uma referência melhor pode ter sido pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda
1
Sim,, [[: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
Nima
O Postgres define o uso de [[:<:]]e afirma que: Esta é uma extensão compatível com, mas não especificada, pelo POSIX 1003.2
Isaac
[[:<:]]também está no FreeBSD, com a mesma ressalva que o PostgreSQL: freebsd.org/cgi/…
ilkkachu
1
E [[: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.
ilkkachu 17/07
9

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 \snas 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. ( casee [[ 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, awke sedtambém, e são descritas, por exemplo, na página de manual do Linuxregex(7)

ilkkachu
fonte