Qual è il significato di [[: space:]] in bash?


23

Mi sono appena imbattuto in uno script bash. Cosa [[:space:]]significa in uno script bash? Perché il doppio colon?

Risposte:


35

È, infatti, nel manuale di Bash, ma aiuta a sapere cosa stai cercando, il che non è utile se non sai cosa stai guardando. Se cercassi, [[verrai distratto dalla [[ expression ]]sezione delle espressioni condizionali. Inoltre, la ricerca di :space:ti atterra in due esempi nella stessa sezione. In quell'esempio potresti seguire il pangrattato:

Ad esempio, quanto segue corrisponderà a una riga (memorizzata nella riga della variabile shell) se nel valore è presente una sequenza di caratteri composta da qualsiasi numero, incluso zero, di caratteri spazio, zero o un'istanza di "a", quindi un 'b':

[[ $line =~ [[:space:]]*?(a)b ]]

... da cui potresti mettere insieme la [[:space:]]parte corrispondente a "personaggi spaziali", ma potresti essere perdonato per aver pensato che fosse solo un personaggio spaziale letterale e non un'intera classe di personaggi, che è ciò che rappresenta.

Se (ti capita di?) Cercare la stringa " space"(cioè uno spazio seguito dalla parola "spazio") nel manuale bash online , ci sono "solo" circa 32 corrispondenze da percorrere. Circa il decimo sarà qui:

All'interno di '[' e ']', le classi di caratteri possono essere specificate usando la sintassi [: class:], dove class è una delle seguenti classi definite nello standard POSIX:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

Una classe di caratteri corrisponde a qualsiasi personaggio appartenente a quella classe.

Che ti porterebbe quindi allo standard POSIX dove potresti cercare il termine "classe di caratteri" e trovare

wctype, wctype_l - definisce la classe di caratteri , che ti porta fino a:

Le funzioni wctype () [CX] [Opzione inizio] e wctype_l () [opzione fine] determinano i valori di wctype_t in base alle regole del set di caratteri codificati definito dalle informazioni sul tipo di carattere nella locale corrente [CX] [Inizio opzione] o nella locale rappresentata dalla locale, rispettivamente [Opzione fine] (categoria LC_CTYPE).

Se poi seguissi il link setlocale , arriveresti finalmente alla tua vera risposta, nella sezione Locale :

spazio

Definire i caratteri da classificare come spazi vuoti. Nella locale POSIX, <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>deve essere incluso esattamente .

In un file di definizione della locale, non deve essere specificato alcun carattere per le parole chiave superiore, inferiore, alfa, cifra, grafico o xdigit. Il <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>set di caratteri portatile e tutti i caratteri inclusi nello spazio vuoto della classe vengono automaticamente inclusi in questa classe.


1
È più facile trovare la corrispondenza manuale con LESS=+'/Within \[ and \],' man bashinvece di 32 ncomandi ext :-).
Isaac,

5
@Isaac Penso che il punto sia insegnare all'uomo come pescare. Detto questo, non lo sapevo less +"$cmd", quindi grazie per quello.
JoL

3
In effetti, ho risposto data la prospettiva del PO; potrebbero essere perdonati per non aver capito che l'esterno []è indipendente dall'interno []. Ho provato (!) A trovare un modo dalla domanda alla risposta senza sapere troppo su quale fosse la risposta, anche se ci sono voluti alcuni tentativi fortunati :)
Jeff Schaller

17

Non è solo per Bash, fa parte della notazione POSIX.

Che cos'è POSIX?

POSIX o "Interfaccia del sistema operativo portatile per uniX" è una raccolta di standard che definiscono alcune delle funzionalità che un sistema operativo (UNIX) dovrebbe supportare. Uno di questi standard definisce due tipi di espressioni regolari.

Espressioni parentesi POSIX

Le espressioni parentesi POSIX sono un tipo speciale di classi di caratteri. Le espressioni parentesi POSIX corrispondono a un carattere di un set di caratteri, proprio come le normali classi di caratteri.

POSIX standard

[[: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

Nessuno standard

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

sintassi legacy (qualcuno può trovare un riferimento a questi?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

Puoi trovare maggiori informazioni qui: wiki


1
[[:ascii:]], e [[:word:]]non sono classi POSIX (sembrano essere bashspecifiche) e non riesco a trovare [[:<:]][[:>:]]. Un riferimento migliore potrebbe essere stato pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
Sì, [[:ascii:]]e [[:word:]]non sono classi POSIX standard. per [[:<:]]e [[:>:]], non riesco a trovare riferimenti, ma è lo stesso \b. en.wikipedia.org/wiki/Regular_expression#Character_classes
Nima


[[:<:]]è in FreeBSD anche, con la stessa avvertenza di PostgreSQL ha: freebsd.org/cgi/...
ilkkachu

1
E [[:ascii:]]e [[:word:]]di lavoro in corso di Bash in pattern matching, ma non nelle espressioni regolari (almeno sul mio sistema, penso che Bash utilizza la libreria di espressioni regolari del sistema). Bah.
ilkkachu,

9

Nelle espressioni regolari e nei pattern globs / shell del nome file, il [...]costrutto corrisponde a qualsiasi carattere di quelli elencati tra parentesi. All'interno di queste parentesi, è possibile utilizzare un numero di classi di caratteri standard nominati . Uno di questi è [:space:], che corrisponde ai caratteri degli spazi bianchi (come \snelle regex del Perl). Vedi ad esempio Pattern Matching nel manuale di Bash

Quindi, [[:space:]]fa parte di un'espressione regolare o di un pattern match, uno che corrisponde solo agli spazi bianchi.

Ad esempio una corrispondenza del modello (shell standard, non specifica di Bash):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

o una regex (Bash):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

Nota che, anche se espressioni fra parentesi quadre [...]funzionano allo stesso modo nelle espressioni regolari e modelli della shell, sono generalmente molto non lo stesso. ( casee [[ string == pattern ]]usa corrispondenze di pattern, [[ string =~ regex ]]usa regex.)

Anche le espressioni regolari non sono specifiche della shell, sono usate in eg awke sedanche e sono descritte ad esempio nella pagina man di Linuxregex(7)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.