Substitua a barra invertida (“\”) por barra (“/”) em uma variável no bash

4

Eu quero substituir a barra invertida ( \ ) pela barra ( / ) em uma variável no bash. Eu tentei assim, mas não funciona:

home_mf = ${home//(\)//(/)}

Por exemplo, eu gostaria de

\a\b\c -> /a/b/c
    
por Para 21.04.2016 / 09:24

2 respostas

8

A substituição correta é

home_mf="${home//\//}"

Isso se divide da seguinte maneira:

  • // substitui todos os
  • \ barra invertida
  • / com
  • / barra

Demonstração:

$ t='\a\b\c'; echo "${t//\//}"
/a/b/c
    
por 21.04.2016 / 11:51
6

Isso fará isso:

home_mf=${home//\//\} # forward to backward slash
home_mf=${home//\/\/} # backward to forward slash

por exemplo:

$ cat slash.sh
#!/bin/bash
set -x
home=/aa/bb/cc       
home_mf=${home//\//\}
echo $home_mf
home_mf=${home_mf//\/\/}
echo $home_mf
$ ./slash.sh
+ home=aa/bb/cc
+ home_mf='\aa\bb\cc'
+ echo '\aa\bb\cc'
\aa\bb\cc
+ home_mf=/aa/bb/cc
+ echo /aa/bb/cc
/aa/bb/cc

A sintaxe ${variable/..} é ksh , bash e possivelmente outras shells específicas, mas não estão presentes em todas as shells baseadas na sintaxe shell da Bourne, por exemplo. %código%. Se você quiser um caminho portátil (POSIX), você pode usar dash :

home_mf=$(printf "%s" "$home" | sed 's/\//\/g')    # forward to backward slash
home_mf=$(printf "%s" "$home_mf" | sed 's/\/\//g') # backward to forward slash
    
por 21.04.2016 / 09:30