web-dev-qa-db-fra.com

Récupère les caractères après le dernier index d'une sous-chaîne d'une chaîne

J'ai une chaîne qui est une sortie d'une autre commande. Je n'ai besoin que de la fin de cette chaîne pour afficher. La chaîne de séparation est ". "(point et espace), et j'ai besoin de la chaîne après le dernier index de" . ".

Comment puis-je faire cela dans Bash?

20
Patartics Milán

essaye ça:

your cmd...|sed 's/.*\. //'

cela fonctionne quel que soit le nombre de "points" ou "points et espaces" dans votre entrée. il prend la chaîne après le dernier "point et espace"

22
Kent

Si la chaîne est dans une variable:

$ foo="header. stuff. more stuff"
$ echo "${foo##*. }"
more stuff

S'il y a plusieurs instances de "." (Comme dans mon exemple) et que vous voulez tout après l'occurrence first, au lieu de la dernière, utilisez simplement un #:

$ echo "${foo#*. }"
stuff. more stuff
25
chepner

Essaye ça:

echo "This is a sentence. This is another sentence" | rev | cut -d "." -f1 | rev

rev inverse la sortie. Le -d spécifie le délimiteur, décomposant tout en champs. Le -f spécifie les champs que vous souhaitez utiliser. Nous pouvons sélectionner f1, car nous avons inversé les données. Nous n'avons pas besoin de savoir combien de champs il y a au total. Nous avons juste besoin de connaître le premier. À la fin, nous l'inversons à nouveau, pour le remettre dans le bon ordre.

7
Paul Calabro

Awk est une arme élégante ... pour un âge plus civilisé:

[cpetro01@h ~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $NF } '
length
[cpetro01@h ~]$ echo "this. is. my. string. of. some" | awk -F'. ' ' { print $NF } '   
some

Dans ce cas, NF est la variable awk pour "Nombre de champs" et cette construction indique "imprimer l'entrée dans le plus grand nombre de champs trouvés", donc si la taille de votre entrée change d'une ligne à la suivante, vous obtiendrez toujours le dernier.

Vous pouvez également faire des calculs:

[cpetro01@h~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $(NF-2) } '
some
[cpetro01@h~]$ echo "this. is. my. string. of. some. arbitrary. length" | awk -F'. ' ' { print $(NF-3) } '
of
[cpetro01@h~]$

(Oui, c'est 3 ans de retard pour l'OP, mais l'un de mes vacher-orkers m'a pointé vers cette page aujourd'hui pour quelque chose sur lequel nous travaillions, alors j'ai pensé que je laisserais cela ici au cas où d'autres le chercheraient aussi.)

5
Petro