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 ?

10voto

Zombo Points 1663

Et un autre :

string="|abcdefg|"
echo "${string//|/}"

3voto

Sergiy Kolodyazhnyy Points 97292

Fonction Shell

Une approche un peu plus verbeuse, mais qui fonctionne avec n'importe quel type de premier et dernier caractère, qui ne doit pas nécessairement être le même. L'idée de base est que nous prenons une variable, la lisons caractère par caractère, et ajoutons seulement ceux que nous voulons dans une nouvelle variable. que nous voulons dans une nouvelle variable

Voici l'ensemble de cette idée formatée en une belle fonction

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 cette même fonction en action :

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

Python

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

ou en ligne de commande :

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

Ruby

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2voto

Tosi Do Points 21

Solution petite et universelle :

expr "|abcdef|" : '.\(.*\).'

Spécial dans ce cas et permettant que le caractère '|' soit présent ou non :

expr "|abcdef" : '|*\([^|]*\)|*'

2voto

Brian Points 21
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg

Desde http://tldp.org/LDP/abs/html/parameter-substitution.html

${var#Pattern}
Retirer de $var el le plus court partie de $Pattern qui correspond à la extrémité avant de $var .
${var%%Pattern}
Retirer de $var el le plus long partie de $Pattern qui correspond à la arrière de $var .

2voto

Triumf Maqedonci Points 141

Vous pouvez utiliser ceci :

echo "|abcdefg|" | tr -d "|"

Avec cette ligne de code, vous supprimez toutes les | ->(pipe) dans la chaîne.

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