在bash中的变量中用正斜杠(“/”)替换反斜杠(“\”)

Par*_*ara 20 bash bash-scripting

我想用bash 中的变量中的\正斜杠(/)替换反斜杠()。我这样试过,但它不起作用:

home_mf = ${home//(\)//(/)}
Run Code Online (Sandbox Code Playgroud)

例如,我想

\a\b\c -> /a/b/c
Run Code Online (Sandbox Code Playgroud)

Tob*_*ght 34

正确的替换是

home_mf="${home//\\//}"
Run Code Online (Sandbox Code Playgroud)

这分解如下:

  • // 更换每一个
  • \\ 反斜杠
  • /
  • / 削减

示范:

$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c
Run Code Online (Sandbox Code Playgroud)

另一种可能更容易阅读的替代方法是引用模式和替换:

home_mf="${home//'\'/"/"}"
Run Code Online (Sandbox Code Playgroud)

  • 很好的正则表达式将其分解为人类可读的句子:)。 (2认同)

jll*_*gre 11

这将做到:

home_mf=${home//\//\\} # forward to backward slash
home_mf=${home//\\//} # backward to forward slash
Run Code Online (Sandbox Code Playgroud)

例如:

$ cat slash.sh
#!/bin/bash
设置 -x
家= /aa/bb/cc       
home_mf=${home//\//\\}
回声 $home_mf
home_mf=${home_mf//\\//}
回声 $home_mf
$ ./斜线.sh
+ 家=aa/bb/cc
+ home_mf='\aa\bb\cc'
+ 回声 '\aa\bb\cc'
\aa\bb\cc
+ home_mf=/aa/bb/cc
+ 回声 /aa/bb/cc
/aa/bb/cc

${variable/..}语法是kshbash和其他可能的炮弹具体,但不会出现在所有基于Bourne shell的语法壳,如dash。如果您想要一种可移植的方式(POSIX),您可以sed改用:

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
Run Code Online (Sandbox Code Playgroud)