¿Cómo puedo eliminar las barras innecesarias en una ruta determinada?Eliminar barras innecesarias de una ruta determinada con bash
Ejemplo:
p="/foo//////bar///hello/////world"
Quiero:
p="/foo/bar/hello/world"
¿Cómo puedo eliminar las barras innecesarias en una ruta determinada?Eliminar barras innecesarias de una ruta determinada con bash
Ejemplo:
p="/foo//////bar///hello/////world"
Quiero:
p="/foo/bar/hello/world"
/foo/.//bar///hello/./world
funcionan bien.readlink -f
, pero esto también canonicalizará los enlaces simbólicos en esa ruta, por lo que el resultado depende de su sistema de archivos y la ruta de acceso debe existir realmente ...., así que esto no va a funcionar para caminos virtualesla mayor parte del tiempo, las barras adicionales funcionan bien, pero en algunos casos causan problemas (una vez tuve esto con una opción de sincronización de datos que no funcionaba correctamente si la ruta tenía barras dobles) – steabert
Gracias por los replys sé que el camino funciona bien sólo quiero esto por razones ópticas
he encontrado otra solución: echo $p | replace '//' ''
Usando puro Bash:
shopt -s extglob
echo ${p//\/*(\/)/\/}
Esto funciona con múltiples separadores y no asume la ruta dada debe existir:
p=/foo///.//bar///foo1/bar1//foo2/./bar2;
echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//"))
gsub("//","/"); print $1;}'
Pero no simplifica también contiene cadenas ".."
Con realpath:
realpath -sm $p
Parámetros:
-m, --canonicalize-missing no components of the path need exist
-s, --strip, --no-symlinks don't expand symlinks
su entrada:
p="/foo//////bar///hello/////world"
comando para quitar las barras irrelevantes:
echo $p | tr -s/
de salida:
/foo/bar/hello/world
podría usar 'readlink -m' su lugar, y el directorio no necesita existir. –
@Ryan Li Gracias, eso es mucho mejor. Actualizado. – phihag
Gracias. Ya probé 'sed 's/\/\ // \ // g'' que no funcionó de la manera que quiero. – casper