Bash supprime les premier et dernier caractères d'une chaîne

81

J'ai une chaîne comme ça:

|abcdefg|

Et je veux obtenir une nouvelle chaîne appelée d'une certaine manière (comme chaîne2) avec la chaîne d'origine sans les deux | au début et à la fin de celui-ci

afin que je vais avoir cette

abcdefg

est-ce possible en bash?

    
posée Matteo Pagliazzi 23.12.2011 - 15:29
la source

8 réponses

107

Vous pouvez faire

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

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

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

De plus, cela devrait fonctionner

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

Aussi ceci

echo "|abcdefg|" | sed 's/^|\(.*\)|$//'
    
réponse donnée Kris Harper 23.12.2011 - 15:49
la source
57

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

string="|abcdefg|"
echo "${string:1:${#string}-2}"
    
réponse donnée Samus_ 24.12.2011 - 17:28
la source
21

Après quelques articles énuméré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

    
réponse donnée jlunavtgrad 05.09.2012 - 22:37
la source
10

Et un autre:

string="|abcdefg|"
echo "${string//|/}"
    
réponse donnée Steven Penny 09.06.2012 - 03:03
la source
10

Une autre manière avec head & queue:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
    
réponse donnée Zavior 26.11.2013 - 17:16
la source
8

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:^.\(.*\).$::'
abcdefg

Où ':' sont les délimiteurs (vous pouvez les remplacer par / ou n’importe quel 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 de saisie 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 effacera tous les caractères même si | ce n'est pas présent dans la chaîne.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$::'
bcdef
    
réponse donnée Metafaniel 08.02.2012 - 02:44
la source
2

fonction shell

Une approche un peu plus verbeuse, mais qui fonctionne pour 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 n’ajoutons que ceux nous voulons une nouvelle variable

Voici toute cette idée formatée en une fonction intéressante

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

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
    
réponse donnée Sergiy Kolodyazhnyy 06.04.2016 - 15:58
la source
1

Solution compacte et universelle:

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

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

expr "|abcdef" : '|*\([^|]*\)|*'
    
réponse donnée Tosi Do 09.07.2017 - 01:29
la source

Lire d'autres questions sur les étiquettes