Não é uma resposta "Bash-only", mas talvez seja útil:
echo "$PWD///" | tr -s '/'
Existe uma maneira mais Bashist do que echo "$PWD//" | sed -e 's#//\+#/#g'
para substituir as barras repetidas por uma única?
Obrigado Steven D , agora há uma função totalmente funcional para encontrar o caminho comum mais longo de dois ou mais caminhos : path_common .
Possível em "bash puro", mas somente com extglob
ativo.
$ shopt -s extglob
$ A="////qsd/////sdfgfg//qsd//////"
$ echo ${A//\/+(\/)/\/}
/qsd/sdfgfg/qsd/
Apenas Bash, usando uma variável:
# code:
shopt -s extglob
A="$PWD//";
echo "Original: $A";
echo "Result: ${A//+(\/)//}"
# output:
Original: /home/myhome/Projects/Bob/build//
Result: /home/myhome/Projects/Bob/build/
// = pesquisar e substituir, continue pesquisando e substituindo
+ (/) = corresponde a um ou mais de "/"
// = substituir por "/"
Para um exemplo visual melhor, digamos que os "z" precisam ser comprimidos para ver melhor isso sem precisar escapar da barra e não ter nossa busca / substituição confundida com a infraestrutura de $ {VAR // pattern / string }:
# code:
shopt -s extglob
A=zzz/zzz/zzzzz/zzzz/zzzz;
echo $A;
echo ${A//+(z)/z}
# output:
zzz/zzz/zzzzz/zzzz/zzzz
z/z/z/z/z
UPDATE: Mat (+ 1) tem a ideia certa ... a minha resposta só funciona para números ímpares de "/"
não precisa de "extglob" para ser definido.
var="$ PWD ///"; var="$ {var // \ / \ //}"; echo "$ var"