124 votes

Bash supprime les premiers et derniers caractères d'une chaîne de caractères

J'ai une chaîne comme ça :

|abcdefg|

Et je veux obtenir une nouvelle chaîne appelée d'une manière ou d'une autre (comme string2) avec la chaîne originale sans les deux. | des caractères au début et à la fin pour que j'aie ça :

abcdefg

Est-ce possible en bash ?

144voto

exhuma Points 366

Vous pouvez faire

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

Ou si la longueur de votre chaîne est constante, vous pouvez faire

string="|abcdefg|"
string2=${string:1:7}
echo $string2

Aussi, ceci devrait fonctionner

echo "|abcdefg|" | cut -d "|" -f 2

Et ceci

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'

78voto

Chris Weiss Points 141

Voici une solution qui est indépendante de la longueur de la chaîne (bash) :

string="|abcdefg|"
echo "${string:1:${#string}-2}"

56voto

jlunavtgrad Points 669

En se basant sur quelques posts listés ici, il semble que la manière la plus simple de le faire soit :

string="|abcdefg|"
echo ${string:1:-1}

edit : fonctionne sur ubuntu avec bash 4.2 ; ne fonctionne pas sur centOS avec bash 4.1

29voto

fikovnik Points 1100

Une autre façon est d'utiliser head & tail des commandes :

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg

11voto

tgandrews Points 2487

Vous pouvez également utiliser sed pour supprimer le | en ne référençant pas seulement le symbole lui-même mais en utilisant des références positionnelles comme dans :

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

Où ':' sont les délimiteurs (vous pouvez les remplacer par / ou n'importe quel caractère qui n'est pas dans la requête, n'importe quel signe suivant le s le fera) Ici ^ (caret) signifie au début de la chaîne d'entrée et $ (dollar) signifie à la fin. Le . (point) qui se trouve après l'astérisque et celui qui se trouve avant le signe dollar représentent un seul caractère. En d'autres termes, nous supprimons le premier et le dernier caractère. Gardez à l'esprit que cela supprimera tous les caractères même s'ils ne sont pas présents dans la chaîne.

EX :

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X