Jak pozbyć się niepotrzebnych ukośników w danej ścieżce?Usuń niepotrzebne ukośniki z danej ścieżki za pomocą bashu
Przykład:
p="/foo//////bar///hello/////world"
chcę:
p="/foo/bar/hello/world"
Jak pozbyć się niepotrzebnych ukośników w danej ścieżce?Usuń niepotrzebne ukośniki z danej ścieżki za pomocą bashu
Przykład:
p="/foo//////bar///hello/////world"
chcę:
p="/foo/bar/hello/world"
/foo/.//bar///hello/./world
działają bez zarzutureadlink -f
, ale to również kanonizuje dowiązania symboliczne w tej ścieżce, więc wynik zależy od systemu plików i podana ścieżka musi faktycznie istnieć ...., więc to nie będzie działać dla wirtualnych ścieżekprzez większość czasu, dodatkowe ukośniki działają dobrze, ale w niektórych przypadkach powodują problemy (miałem kiedyś to z opcją rsync, która nie działała poprawnie, jeśli ścieżka miała podwójne ukośniki) – steabert
Dzięki za replys wiem ścieżka działa prawidłowo chcę tylko to ze względów optycznych
znalazłem inne rozwiązanie: echo $p | replace '//' ''
Używanie czystego Basha:
shopt -s extglob
echo ${p//\/*(\/)/\/}
ten współpracuje z wieloma separatorami i nie zakładają podanej ścieżki powinny istnieć:
p=/foo///.//bar///foo1/bar1//foo2/./bar2;
echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//"))
gsub("//","/"); print $1;}'
Ale czy dobrze nie uprości ciągi zawierające ".."
Z realpath:
realpath -sm $p
Parametry:
-m, --canonicalize-missing no components of the path need exist
-s, --strip, --no-symlinks don't expand symlinks
Twój wkład:
p="/foo//////bar///hello/////world"
polecenia w celu usunięcia zbędnych ukośniki:
echo $p | tr -s/
wyjściowa:
/foo/bar/hello/world
Przydałoby 'readlink -m' zamiast, a katalog nie musi istnieć. –
@Ryan Li Dzięki, to rzeczywiście dużo lepsze. Zaktualizowano. – phihag
Dzięki. Próbowałem już 'sed 's/\/\ // \ // g'' który nie działał tak, jak chcę. – casper