Dans le script bash,
J'ai une chaîne qui contient plusieurs mots séparés par un ou plusieurs espaces. c'est à dire:
Name Age Sex ID Address
Si je veux trouver n'importe quel mot, par exemple je veux trouver l'index du mot "Age", comment puis-je le faire?
Existe-t-il une commande qui renvoie directement le numéro d’index du mot que je veux?
Merci.
Réponses:
Bash effectue le fractionnement des mots dans les chaînes tout seul - en fait, le plus souvent, éviter que ce soit un problème, et la raison pour laquelle citant est si important. Il est facile de tirer parti de cela dans votre cas: placez simplement votre chaîne dans un tableau sans la citer: bash utilisera le fractionnement de mots pour séparer les éléments individuels. En supposant que votre chaîne est stockée dans la variable
$str
,retournera un tableau de 5 éléments. Votre index de tableau est votre index de mots (comptant à partir de 0, comme dans la plupart des langages de script et de programmation), c’est-à-dire que vous accédez à «Age» à l’aide de
ou, si vous avez besoin de trouver l'index d'élément par contenu, passez en boucle sur le tableau, c.-à-d.
la source
Remplacez * Age avec Age - cela supprimera tout ce qui précède "Age":
Obtenir quelque chose avant "Age"
Obtenez la longueur de cette chaîne (qui est l'index de "Age"):
la source
export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}
print 'warn error'Si vous n'avez pas à utiliser strictement bash, mais pouvez utiliser d'autres programmes couramment trouvés sur les systèmes dotés de bash, vous pouvez utiliser quelque chose comme ceci:
Python commence son indexation de chaîne à zéro, donc j'ai ajouté +1 à la fin de la commande.
la source
Vous pouvez utiliser l'expression rationnelle native de bash
Sortie
la source
Remarque : Supposons ici que vous voulez dire par index que vous voulez savoir de quel mot il s’agit (à partir de 0) et non du caractère de la chaîne sur lequel le mot commence. D'autres réponses abordent ce dernier.
Pas que je sache, mais vous pouvez en faire un. Deux astuces:
Code:
la source
Essayez l’insertion de javascript suivante dans un shell (utilisez shell javascript):
Ou avec un ici-doc:
la source
J'ai trouvé une solution qui fonctionne bien.
Il fonctionne de la même manière que la fonction indexOf () en Java, qui renvoie la première occurrence d’une chaîne d’entrée.
Trouvé cette solution ici http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (dernier post). Ce mec a sauvé ma journée. Crédit à lui.
Manière plus rapide si vous voulez faire une sous-chaîne à partir du premier indexof.
https://stackoverflow.com/questions/10349102/shell-script-substring-from-first-indexof-substring
la source
Si des coreutils sont disponibles, vous pouvez le faire de la manière suivante:
À la demande de MariusMatutiae, j'ajoute une explication sur le fonctionnement de cette opération en 3 étapes:
Pour les références s'il vous plaît vérifier:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html (voir: "Extension variable / Remplacement de sous-chaîne")
http://www.gnu.org/software/coreutils/manual/coreutils .html (allez à: "La commande cut" et "invocation de wc"
la source
Un mélange de deux réponses données précédemment, utilisant des tableaux de bash purs et un remplacement de sous-chaîne.
L'idée est d'obtenir une chaîne de tous les mots avant celle que vous voulez, puis de compter le nombre de mots de cette sous-chaîne en la transformant en un tableau.
Bien sûr, l'âge peut être stocké dans une autre variable
needle
, puis utilisé${haystack%$needle*}
. Attendez-vous à des problèmes si le mot que vous recherchez est un sous-ensemble d'un autre mot, auquel cas la réponse de Kopischke fonctionne toujours.la source