5

Я хочу заменить обратную косую черту (\) на прямую косую черту (/) в переменной в bash. Я попробовал это так, но это не работает:

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

Например, я хотел бы

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

2 ответа2

8

Правильная замена

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

Это разбивается следующим образом:

  • // заменить каждый
  • \\ обратная косая черта
  • / с
  • / косая черта

Демонстрация:

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

Это сделает это:

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

например:

$ 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

Синтаксис ${variable/..} является специфичным для ksh , bash и, возможно, других оболочек, но не присутствует во всех оболочках, основанных на синтаксисе оболочки Bourne, например, 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .