L'extraction de nom de répertoire à partir d'un chemin d'accès absolu à l'aide de sed ou awk
Je veux partager cette ligne
/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh
à
/home/edwprod/abortive_visit/bin
à l'aide de sed
ou awk
scripts? Pouvez-vous l'aider sur ce point?
- Quel est le contexte? C'est que dans un fichier? Avez-vous plus d'une occurrence? Avez-vous... ?
- sed et awk sont beaucoup trop lourds pour cela, les coquilles ont des utilitaires directement.
- si vous utilisez bash: pourquoi ne pas utiliser
dirname
commande?
Vous devez vous connecter pour publier un commentaire.
Peut être commande dirname est ce que vous recherchez?
Ou si vous voulez sed, afin de voir ma solution:
sed
à base de solution a un problème avec chemin d'accès contenant uniquement un nom de base.dirname
retourne.
dans ce cas.dirname
sed
grep
awk
dirname
il y a un problème avec les chemins contenant uniquement basename.dirname
donne.
dans ce cas.grep
version retourne une chaîne vide et d'autres œuvres commebasename
awk
appel échouera également sur des cas commefoo/bar/
awk + pour :
Ce code avec awk fonctionne parfaitement en tant que mêmes que dirname, je suppose.
C'est tellement simple et a un très faible coût pour fonctionner. Bonne chance.
Code
Résultat
/app/java/jdk1.7.0_71/bin
Test
foo=/app/java/jdk1.7.0_71/bin/java
->/app/java/jdk1.7.0_71/bin
foo=/app/java/jdk1.7.0_71/bin/
->/app/java/jdk1.7.0_71
foo=/app/java/jdk1.7.0_71/bin
->/app/java/jdk1.7.0_71
foo=/app/
->/
foo=/app
->/
foo=fighters/
->.
Plus
Si vous n'êtes pas disponibles, tels awk délimiteur, essayez de cette façon.
/foo/////bar
avec plusieurs barres obliques. Une solution serait:awk -F "/?[^/]*/?$" '{gsub("/+","/"); print ($1==""?(substr($0, 1, 1)=="/"?"/":".") : $1); }'
awk -F "/*[^/]*/*$" '{print ($1==""?(substr($0, 1, 1)=="/"?"/":".") : $1); }'
Diffences:"/?[^/]*/?$"
->"/*[^/]*/*$"
Ce couvre un autre échoue:/foo/////bar/////
Merci.Pour la plupart des plates-formes et Unix/Linux coquilles maintenant disponible
dirname
:À l'aide de
dirname
est la plus simple, mais il n'est pas recommandé pour la croix-plate-forme de script par exemple dans la dernière version deautoconf
documentation http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Usual-Tools.html#Limitations-of-Usual-Tools .Donc ma version complète de
sed
de remplacement pourdirname
:Exemples:
Il fonctionne comme
dirname
:/aa/bb/cc
, il permet d'imprimer/aa/bb
/aa/bb
, il permet d'imprimer/aa
/aa/bb/
, il permet d'imprimer/aa
trop./aa/
, il permet d'imprimer/aa
/
, il permet d'imprimer/
aa
, il permet d'imprimer.
aa/
, il permet d'imprimer.
Qui est:
/
aa
etaa/
/
et le chemin d'accès/
lui-même.$str
si elle contient\n
à la fin ou pas, même avec de nombreux\n
/
(//
///
) à/
Note
Alternative pour
basename
peut être utile:En outre, la réponse de Kent, une alternative awk solution est:
qui a la même maladie que celle présentée par Kent. Le suivant, un peu plus Awk corrige tous les défauts:
Le tableau suivant montre la différence:
remarque:
dirname
est la vraie façon de faire, sauf si vous avez à traiter des masses de leur stockées dans un fichier.