web-dev-qa-db-fra.com

Extraction d'une partie d'une chaîne vers une variable dans bash

noob ici, désolé si un republication. J'extrait une chaîne d'un fichier et je me retrouve avec une ligne, quelque chose comme:

abcdefg:12345:67890:abcde:12345:abcde

Disons que c'est dans une variable nommée testString que la longueur des valeurs entre les deux-points n'est pas constante, mais je veux enregistrer le nombre, car une chaîne est très bien, dans une variable, entre les 2e et 3e colons. dans ce cas, je me retrouverais avec ma nouvelle variable, appelons-la extractNum, étant 67890. Je suppose que je dois utiliser sed mais je ne l'ai jamais utilisé et j'essaie de comprendre ce que je peux faire ... Quelqu'un peut-il m'aider? À votre santé

Sur une note latérale, j'utilise find pour extraire la ligne entière d'une chaîne, en recherchant la 1ère chaîne de caractères, dans ce cas la partie abcdefg.

15
Steven Cragg

Voici une autre manière pure de bash. Fonctionne bien lorsque votre saisie est raisonnablement cohérente et que vous n'avez pas besoin de beaucoup de flexibilité dans la section que vous choisissez.

extractedNum="${testString#*:}"     # Remove through first :
extractedNum="${extractedNum#*:}"   # Remove through second :
extractedNum="${extractedNum%%:*}"  # Remove from next : to end of string

Vous pouvez également filtrer le fichier lors de sa lecture, dans une boucle while par exemple:

while IFS=' ' read -r col line ; do
    # col has the column you wanted, line has the whole line
    # # #
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile")

La commande sed sélectionne la 2ème colonne et délimite cette valeur de la ligne entière avec un espace. Si vous n'avez pas besoin de la ligne entière, supprimez simplement l'espace + & du remplacement et supprimez la variable de ligne de la lecture. Vous pouvez sélectionner n'importe quelle colonne en modifiant le nombre dans le bit\{2 \}. (Mettez la commande entre guillemets si vous souhaitez y utiliser une variable.)

10
William

Pure Bash utilisant un tableau:

testString="abcdefg:12345:67890:abcde:12345:abcde"
IFS=':'
array=( $testString )
echo "value = ${array[2]}"

Le résultat:

value = 67890
16
Fritz G. Mehner

Vous pouvez utiliser cut pour ce genre de choses. Voici:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR

Pour le plaisir, c'est comme ça que je (ne) ferais pas avec sed, mais je suis sûr qu'il existe des moyens plus simples. Je suppose que ce serait une question de moi-même pour les futurs lecteurs;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/"
5
Miquel

cela devrait fonctionner pour vous: la partie clé est awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3')

exemple:

kent$  newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3')

kent$  echo $newVar 
67890

si votre texte était stocké dans var testString, vous pourriez:

kent$  echo $testString                                                                                                                                                     
abcdefg:12345:67890:abcde:12345:abcde
kent$  newVar=$(awk -F: '$0=$3' <<<"$testString")
kent$  echo $newVar                                                                                                                                                         
67890
2
Kent