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


J'ai une chaîne comme ça:

|abcdefg|

Et je veux obtenir une nouvelle chaîne appelée en quelque sorte (comme string2) avec la chaîne d'origine sans les deux | au début et à la fin

de sorte que je vais avoir cela

abcdefg

est-ce possible à bash?


77
2017-12-23 14:29


origine




Réponses:


Tu peux 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

En outre, cela devrait fonctionner

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

Aussi cette

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

106
2017-12-23 14:49



et aussi awk -F\| '{ print $2 }' <<<"|string|" - enzotib
@enzotib Vous avez toujours cool awk solutions. j'ai besoin d'apprendre awk. - Kris Harper
et aussi IFS='|' read string2 <<< $string :) - arrange
et aussi, en bash 4.2 et plus récent, "${string:1:-1}" - geirha
Lire sous la section "extension des paramètres" dans man bash. - Nemo


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

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

52
2017-12-24 16:28





En sortant de quelques articles 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


18
2017-09-05 20:37





Et un autre:

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

10
2018-06-09 01:03





Une autre façon avec la tête et la queue:

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

9
2017-11-26 16:16



J'ai eu une chaîne de [something something] avec un objectif de couper les crochets, donc echo "[something something]" | tail -c +2 | head -c -2 élaboré. Merci pour un conseil! - Ain Tohvri


Vous pouvez également utiliser sed pour supprimer le | non seulement référencer 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 / 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 d'entrée et $ (dollar) signifie à la fin. Le . (point) que c'est après le caret et que c'est avant que le signe dollar représente un seul caractère. En d'autres termes, nous supprimons les premiers et derniers 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

8
2018-02-08 01:44





fonction shell

Une approche un peu plus verbeuse, mais qui fonctionne sur n'importe quel premier et dernier caractère, ne doit pas nécessairement être la même. L’idée de base est que nous prenons une variable, la lisant caractère par caractère, et n’ajoutant que celles nous voulons une nouvelle variable

Voici toute cette idée formatée dans 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 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 sur la 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

Rubis

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

2
2018-04-06 13:58