Comment faire pour extraire les numéros à partir d'une chaîne?
J'ai de la chaîne contient un chemin d'accès
string="toto.titi.12.tata.2.abc.def"
Je veux extraire seulement les numéros de cette chaîne.
Pour extraire le premier nombre:
tmp="${string#toto.titi.*.}"
num1="${tmp%.tata*}"
Pour extraire le deuxième nombre:
tmp="${string#toto.titi.*.tata.*.}"
num2="${tmp%.abc.def}"
Donc pour extraire un paramètre que je dois le faire en 2 étapes. Comment extraire un nombre avec une seule étape?
Cette question a été assis autour pendant un certain temps maintenant. Si aucune des réponses fournir ce que vous recherchez, alors pourriez-vous mettre à jour votre question à clarifier vos besoins un peu plus?
OriginalL'auteur MOHAMED | 2013-07-26
Vous devez vous connecter pour publier un commentaire.
Pour extraire tous les numéros de l'individu et d'imprimer un nombre de mots par ligne de tuyau par -
Ventilation:
tr '\n' ' '
sed -e 's/[^0-9]//g'
-e 's/^ *//g'
-e 's/*$//g'
tr -s ' '
sed 's//\n/g'
Exemple:
Imprimé
OriginalL'auteur cchamberlain
Vous pouvez utiliser
tr
pour supprimer tous les non-chiffres, comme suit:122
dans votre exemple. Comment pourraient-ils être séparés?OriginalL'auteur mti2935
Paramètre d'expansion semble être à l'ordre du jour.
Bien sûr, cela dépend du format de
$string
. Mais au moins pour l'exemple que vous avez fournies, il semble que cela fonctionne.Cela peut être supérieure à anubhava de awk solution qui nécessite un shell interne est exécuté. J'aime aussi chepner de la solution, mais les expressions régulières sont "plus lourd" que le paramètre d'extension (bien évidemment de manière plus précise). (Notez que dans l'expression ci-dessus,
[^0-9]
peut look comme une expression régulière de l'atome, mais il ne l'est pas.)Vous pouvez lire au sujet de cette forme de Paramètre ou l'Expansion dans la page de manuel de bash. Notez que
${string//this/that}
(ainsi que le<<<
) est un bashism, et n'est pas compatible avec la traditionnelle Bourne ou posix coquilles.$string
? Je ne connais pas d'exemple qui permettrait de le casser.Heh, c'est une vieille question. 🙂 La seule chose à laquelle je pense, à ce point, c'est que si il y a d'autres numéros, dire
aa12aa34aa56
, et vous ne lisez deux variables, la fuite des numéros ajoutés à la dernière variable, séparées par des espaces. Si c'était une inquiétude, la meilleure solution pourrait être de lire la chaîne de caractères dans un tableau:read -a nums <<<"${string//[^0-9]/ }"
.OriginalL'auteur ghoti
Utilisation de awk:
OriginalL'auteur anubhava
Vous pouvez également utiliser sed:
Ici, sed remplace
[0-9]
)*
)/
),g
représente à l'échelle mondiale.Sortie sera:
OriginalL'auteur jderefinko
Ce serait plus facile de répondre si vous avez fourni exactement le résultat que vous cherchez à obtenir. Si vous voulez dire que vous voulez obtenir simplement les chiffres de la chaîne, et supprimer tout le reste, vous pouvez le faire:
Si vous clarifier un peu, j'ai peut être en mesure d'aider plus.
OriginalL'auteur drldcsta
Utiliser l'expression régulière correspondant à:
OriginalL'auteur chepner
Hi ajoutant encore une autre façon de le faire à l'aide de 'couper',
Cela vous donne la sortie suivante:
12 2
OriginalL'auteur Vivek-Ananth
Ici est court:
avec un espace entre les chiffres.
Espérons que cela aide...
OriginalL'auteur Adi Azarya