Supposons que j'ai la chaîne 1:2:3:4:5
et que je veuille obtenir son dernier champ ( 5
dans ce cas). Comment faire cela en utilisant Bash? J'ai essayé cut
, mais je ne sais pas comment spécifier le dernier champ avec -f
.
293
Vous pouvez utiliser des opérateurs de chaîne :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Cela coupe tout de l'avant jusqu'à un ':', avec avidité.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
5
si la chaîne l'est1:2:3:4:5:
(tout en utilisant les opérateurs de chaîne donne un résultat vide). Ceci est particulièrement pratique lors de l'analyse de chemins pouvant contenir (ou non) un/
caractère de fin .${foo%:*}
.#
- Depuis le début;%
- de fin.#
,%
- correspondance la plus courte;##
,%%
- match le plus long.echo ${pwd##*/}
ne marche pas.pwd
comme une variable. Essayezdir=$(pwd); echo ${dir##*/}
. Travaille pour moi!Une autre façon consiste à inverser avant et après
cut
:Cela permet d'obtenir très facilement le dernier mais un seul champ, ou toute plage de champs numérotés à partir de la fin.
la source
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, c'était juste ce dont j'avais besoin!cut -b20- | rev | cut -b10- | rev
Il est difficile d'obtenir le dernier champ en utilisant cut, mais voici quelques solutions dans awk et perl
la source
/
caractère de finition :/a/b/c/d
et/a/b/c/d/
donnent le même résultat (d
) lors du traitementpwd | awk -F/ '{print $NF}'
. La réponse acceptée entraîne un résultat vide dans le cas de/a/b/c/d/
/
comme délimiteur, et si votre chemin est,/my/path/dir/
il utilisera la valeur après le dernier délimiteur, qui est simplement une chaîne vide. Il est donc préférable d'éviter la barre oblique si vous devez faire une chose comme moi.awk '{$NF=""; print $0}' FS=: OFS=:
fonctionne souvent assez bien.En supposant une utilisation assez simple (aucun échappement du délimiteur par exemple), vous pouvez utiliser grep:
Ventilation - recherchez tous les caractères et non le délimiteur ([^:]) à la fin de la ligne ($). -o imprime uniquement la pièce correspondante.
la source
Une manière:
Un autre, en utilisant un tableau:
Encore un autre avec un tableau:
Utilisation d'expressions régulières Bash (version> = 3.2):
la source
Traduisez simplement le délimiteur en une nouvelle ligne et choisissez la dernière entrée avec
tail -1
.la source
\n
, mais dans la plupart des cas, c'est la solution la plus lisible.En utilisant
sed
:la source
Si votre dernier champ est un seul caractère, vous pouvez le faire:
Vérifiez la manipulation des chaînes dans bash .
la source
a
, pas le dernier champ .Il y a beaucoup de bonnes réponses ici, mais je veux quand même partager celle-ci en utilisant le nom de base :
Cependant, il échouera s'il y a déjà un '/' dans votre chaîne . Si slash / est votre délimiteur, il vous suffit (et devrait) utiliser le nom de base.
Ce n'est pas la meilleure réponse, mais cela montre simplement comment vous pouvez être créatif en utilisant les commandes bash.
la source
Utilisation de Bash.
la source
echo ${!#}
au lieu deeval echo \$${#}
.Utilisez d'abord xargs pour le diviser en utilisant ":", - n1 signifie que chaque ligne n'a qu'une seule partie. Ensuite, tapez la dernière partie.
la source
la source
Pour ceux qui sont à l'aise avec Python, https://github.com/Russell91/pythonpy est un bon choix pour résoudre ce problème.
De l'aide pythonpy:
-x treat each row of stdin as x
.Avec cet outil, il est facile d'écrire du code python qui est appliqué à l'entrée.
la source
Peut-être un peu tard avec la réponse, bien qu'une solution simple soit d'inverser l'ordre de la chaîne d'entrée. Cela vous permettrait de toujours gagner le dernier élément, quelle que soit sa longueur.
Il est important de noter cependant que si vous utilisez cette méthode et que les nombres sont supérieurs à 1 chiffre (ou supérieur à un caractère en toute circonstance), vous devrez exécuter une autre commande 'rev' sur la sortie canalisée.
J'espère que je peux vous aider
la source
Une solution utilisant la lecture intégrée:
Ou, pour le rendre plus générique:
la source
Si vous aimez python et avez une option pour installer un paquet, vous pouvez utiliser cet utilitaire python .
la source
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
package est de vous faire faire les mêmes chosespython -c
qu'avec moins de saisies de caractères. Veuillez consulter le fichier README dans le référentiel.L'appariement des expressions rationnelles
sed
est gourmand (va toujours à la dernière occurrence), que vous pouvez utiliser à votre avantage ici:la source