J'ai une ficelle comme ça:
|abcdefg|
Et je veux obtenir une nouvelle chaîne appelée de quelque manière (comme chaîne2) avec la chaîne d'origine sans les deux caractères |
au début et à la fin de celle-ci, de manière à avoir ceci:
abcdefg
Est-ce possible à Bash?
Tu peux faire
string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Ou si votre longueur de chaîne est constante, vous pouvez faire
string="|abcdefg|"
string2=${string:1:7}
echo $string2
En outre, cela devrait fonctionner
echo "|abcdefg|" | cut -d "|" -f 2
Aussi cette
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Voici une solution indépendante de la longueur de la chaîne (bash):
string="|abcdefg|"
echo "${string:1:${#string}-2}"
Après quelques articles listés ici, il semble que le moyen le plus simple de le faire est:
string="|abcdefg|"
echo ${string:1:-1}
edit: fonctionne sur Ubuntu avec Bash 4.2; ne fonctionne pas sur centOS avec bash 4.1
Une autre méthode consiste à utiliser les commandes head
& tail
:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
Et un autre:
string="|abcdefg|"
echo "${string//|/}"
Vous pouvez également utiliser sed pour supprimer le | pas simplement en référençant le symbole lui-même mais en utilisant des références de position comme dans:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Où ':' sont les délimiteurs (vous pouvez les remplacer par tout caractère ne figurant pas dans la requête, tout 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) que c'est après le curseur et celui qui est avant le signe dollar représente un seul caractère. En d'autres termes, nous supprimons les premier et dernier caractères. Gardez à l'esprit que cela supprimera tous les caractères, même si | ce n'est pas présent dans la chaîne.
EX:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Une approche un peu plus verbeuse, mais qui fonctionne sur tous les types de premier et dernier caractères, ne doit pas nécessairement être identique. L'idée de base est que nous prenons une variable, la lisons caractère par caractère et ajoutons uniquement ceux que nous souhaitons à une nouvelle variable.
Voici toute cette idée formatée dans une fonction de Nice
crop_string_ends() {
STR="$1"
NEWSTR=""
COUNT=0
while read -n 1 CHAR
do
COUNT=$(($COUNT+1))
if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ]
then
continue
fi
NEWSTR="$NEWSTR"$CHAR
done <<<"$STR"
echo $NEWSTR
}
Et voici la même fonction en action:
$> crop_string_ends "|abcdefg|"
abcdefg
$> crop_string_ends "HelloWorld"
elloWorl
>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg
ou en ligne de commande:
$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"
abcdefg
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ Ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg
De http://tldp.org/LDP/abs/html/parameter-substitution.html
${var#Pattern}
Supprimez de$var
la partie shortest de$Pattern
qui correspond à la front end de$var
.${var%%Pattern}
Supprimez de$var
la plus longue partie de$Pattern
qui correspond à la back end de$var
.
Solution petite et universelle:
expr "|abcdef|" : '.\(.*\).'
Spécial dans ce cas et permettant que le '|' personnage peut être ou non:
expr "|abcdef" : '|*\([^|]*\)|*'