25 votes

Remplacer la barre oblique inversée ("\") par la barre oblique ("/") dans une variable en bash

Je veux remplacer le backslash( \ ) avec une barre oblique ( / ) dans une variable dans bash. J'ai essayé comme ça, mais ça ne marche pas :

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

Par exemple, je voudrais

\a\b\c -> /a/b/c

41voto

Toby Speight Points 4636

La substitution correcte est

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

Elle se décompose comme suit :

  • // remplacer chaque
  • \\ barre oblique inversée
  • / avec
  • / barre oblique

Démonstration :

$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c

Une alternative qui pourrait être plus facile à lire serait de citer le modèle et le remplacement :

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

12voto

jlliagre Points 13539

Cela va le faire :

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

Par exemple :

$ **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**

El ${variable/..} La syntaxe est ksh , bash et éventuellement d'autres shells spécifiques mais qui ne sont pas présents dans tous les shells basés sur la syntaxe Bourne Shell, par exemple dash . Si vous voulez une méthode portable (POSIX), vous pouvez utiliser sed à la place :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X