Recolher caracteres repetidos

3

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 .

    
por l0b0 15.04.2011 / 15:09

4 respostas

8

Não é uma resposta "Bash-only", mas talvez seja útil:

echo "$PWD///" | tr -s '/'
    
por 15.04.2011 / 17:16
5

Possível em "bash puro", mas somente com extglob ativo.

$ shopt -s extglob
$ A="////qsd/////sdfgfg//qsd//////"
$ echo ${A//\/+(\/)/\/}
/qsd/sdfgfg/qsd/
    
por 15.04.2011 / 15:42
2

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
    
por 18.03.2015 / 19:57
0

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"

    
por 19.04.2011 / 11:56