2008-11-27 11 views
7

bash En supposant une variable contient des espaces, des sauts de ligne, onglets et suivi d'un texte, pourquoi ceci:supprimer les espaces de variables

${var#"${var%%[![:space:]]*}"} # strip var of everything 
           # but whitespace 
           # then remove what's left 
           # (i.e. the whitespace) from var 

enlever l'espace blanc et laisser le texte, mais ceci:

${var##[:space:]*} # strip all whitespace from var 

n'est pas?

Répondre

26

Si je définis var=" This is a test ", vos deux suggestions ne fonctionnent pas; juste la substance principale est enlevée. Pourquoi ne pas utiliser la fonctionnalité qui supprime remplacer toutes les occurrences d'espaces et pas seulement la première: de

${var//[[:space:]]} 
4

[: space:] est une classe de caractères. Ce n'est valable que s'il est imbriqué dans un autre ensemble de [].

+0

Merci - Je ne savais pas que les classes de caractères requis entre parenthèses imbriquées. – MCS

+0

@MCS - Ceci est documenté dans regex (7) ("man 7 regex" pour le lire). La plupart des implémentations de regex modernes incluent la prise en charge des classes de caractères nommées POSIX, vous pouvez donc les lire dans la page de manuel perlre de perl, par exemple. – converter42

0

Qu'en est-$ (echo $ var)

> a=" 123 456 " ; a2="$(echo $a)" ; echo "a=\"${a}\" a2=\"${a2}\"" 
a=" 123 456 " a2="123 456" 
Questions connexes