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.
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.)
Pure Bash utilisant un tableau:
testString="abcdefg:12345:67890:abcde:12345:abcde"
IFS=':'
array=( $testString )
echo "value = ${array[2]}"
Le résultat:
value = 67890
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/"
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