Unix cut sauf les deux derniers jetons

j'essaie d'analyser les noms de fichiers dans un répertoire spécifique. Les noms de fichiers sont de format:

token1_token2_token3_token(N-1)_token(N).sh

je dois couper les jetons en utilisant le délimiteur '_' , et j'ai besoin de prendre la chaîne sauf les deux derniers jetons. Dans l'examlpe ci-dessus la sortie doit être token1_token2_token3 .

Le nombre de jetons n'est pas fixe. J'ai essayé de le faire avec l'option -f#- de la commande cut , mais je n'ai pas trouvé de solution. Des idées?

14
demandé sur ysth 2012-12-23 15:00:13

4 réponses

avec coupe:

$ echo t1_t2_t3_tn1_tn2.sh | rev | cut -d_ -f3- | rev
t1_t2_t3

rev inverse chaque ligne. Le 3- dans -f3- signifie À partir du troisième champ jusqu'à la fin de la ligne (qui est le début de la ligne à travers le troisième et dernier champ dans le texte non lu).

27
répondu ysth 2016-09-01 03:06:16

vous pouvez utiliser la substitution de paramètre définie par POSIX:

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3
6
répondu Rubens 2013-08-03 18:03:07

il ne peut pas être fait avec cut , Comment jamais vous pouvez utiliser sed ou awk

sed -r 's/(_[^_]+){2}$//g'
3
répondu Shiplu Mokaddim 2012-12-23 11:06:40

Juste une autre façon d'écrire ysth la réponse de

echo "t1_t2_t3_tn1_tn2.sh"| rev / cut-d"_ " - f1,2 --complement / rev

0
répondu Rahul 2015-08-18 10:10:31