Comment couper tous les caractères après le dernier '/'?
Ce texte
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
devrait revenir
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
la source
la source
basename
etdirname
faites-le déjà./
" est devenu "Comment puis-je couper tous les caractères après le dernier '/'?" qui est un changement de formulation qui garde raisonnablement le sens, OMI. Si quoi que ce soit, j'ai senti la partie "omettre ce qui est ..." ambiguë: les exemples semblent conserver ce qui est avant le/
. L'exemple le montre clairement de toute façon.Réponses:
Si vous voulez obtenir la "partie coupée"
Vous pouvez utiliser
par exemple.
production
(Remarque: ceci utilise la capacité de sed à utiliser un séparateur autre que /, dans ce cas |, dans la commande s)
Si vous souhaitez obtenir le début de la chaîne:
Vous pouvez utiliser
par exemple.
production
la source
#
au lieu de/
. Vous pouvez également utiliser l'option-r
si vous ne voulez pas échapper `\` chaque caractère spécial:sed -r 's#(^.*)/.*$#\1#'
.Si vous coupez hors les extrémités des chaînes,
dirname
pourrait correspondre à la facture:Si vous essayez d'isoler la dernière partie de la chaîne, utilisez
echo /$(basename "$str")
.la source
dirname
etbasename
ne sont pas largement connus, maissed
et leawk
sont.cat text | basename
ne fonctionnera pas. Donc, une bonne solution à la question de OP en utilisantdirname
etbasename
impliqueraitxargs
etc.Expansion des paramètres dans
bash
Vous pouvez utiliser l'expansion des paramètres dans
bash
, dans ce cas${parameter%word}
oùword
est/*
${parameter##word}
oùword
est*/
Exemples:
Supprimer la dernière partie
Ceci est décrit dans
man bash
:Supprimer tout sauf la dernière partie
Vous pouvez ajouter une barre oblique comme ça
pour obtenir exactement ce que vous vouliez dans une instance particulière en fonction de la question modifiée. Mais la question a été modifiée par plusieurs personnes après cela et il n'est pas facile de savoir ce que vous voulez maintenant.
Ceci est décrit dans
man bash
:la source
Une autre façon consiste à utiliser
grep
pour afficher uniquement la dernière barre oblique par ligne et ce qui suit:Explication:
-o
indiquegrep
de ne montrer que la partie correspondante de la ligne au lieu de la ligne entière.Le modèle
/[^/]*$
correspond à une barre oblique littérale/
suivie de n'importe quel caractère à l'exception d'une barre oblique[^/]
un certain nombre de fois*
jusqu'à la fin de la ligne$
.la source
Tout simplement parce que d'autres ont publié des réponses plus «saines», voici une réponse un peu idiote:
rev
inverse les caractères de chaque ligne, par exempleabcd/ef/g
devientg/fe/dcba
. Ensuite ,cut
coupe le premier segment. Enfin, c'est à nouveau inversé.la source
Solution classique avec
awk
, qui traite/
comme séparateur de champ à la fois pour l'entrée et la sortie et définit le dernier champ sur une chaîne vide (qui est vraiment un "déréférencement" de laNF
variable du nombre de champs ):Plus court, comme Fedorqui l'a souligné dans les commentaires:
Une variation à ce sujet serait de mettre le chemin dans
awk
l'environnement d'exécution de, ce qui économisera de la plomberie mais rendra laawk
portion plus verbeuse:la source
NF--
? De cette façon, vous avoud leprint
bla bla.Ajout à la réponse d'Egmont car la question a été modifiée ...
Utilisez --complement si vous souhaitez supprimer le premier champ avec -f1 .
De plus, la question n'est pas tout à fait claire de ce qui devrait arriver avec des entrées ne contenant pas de barres obliques. xxxx => xxxx ou xxxx => rien
la source
--complement
option auparavant et la page de manuel est circulaire. Complément signifie complément. J'ai trouvé un joli tutoriel de coupe qui le couvre sur yourownlinux.com/2015/05/… C'est comme-v
dansgrep
. Donnez-moi tout sauf ce qui était assorti.-f2-
est une forme plus simple pour-f1 --complement
.