Eu tenho um caminho do Windows em uma variável bash como uma string:
file='C:\Users\abcd\Downloads\testingFile.log'
Eu estou tentando converter esse caminho em um caminho Linux começando com /c/Users...
.
Minha tentativa
Os seguintes trabalhos:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Problema
Aqui, eu fiz isso para uma string que contém o caminho do arquivo. A razão pela qual estou fazendo essa pergunta é que tenho que converter 20 dessas strings em um script bash no Ubuntu 16.04 e cada vez que faço isso, escrevo 2 linhas por conversão - está ocupando muito espaço!
Questão
Existe uma maneira de combinar os 2 comandos
file=${file/C://c}
file=${file//\\//}
em um comando?
Respostas:
Haveria uma maneira de fazer as duas substituições ao mesmo tempo
sed
, mas não é necessário.Aqui está como eu resolveria esse problema:
Se você deseja colocar a saída em uma matriz em vez de imprimir, substitua a
echo
linha por uma atribuição:fonte
f1
ef2
, como isso funcionaria? Quero dizer, como reatribuir os novos nomes de arquivos à matriz, substituindo os antigos?Se é algo que você deseja fazer várias vezes, por que não criar uma pequena função de shell?
fonte
/c/Users...
- ao contrário, está dandoC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
no subsistema Windows para Linux, funciona como um encanto!Você seria capaz de conseguir isso em uma linha usando sed
Observe que os dois padrões devem permanecer separados, pois as correspondências são substituídas por substituições diferentes.
fonte
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Essa pergunta ainda está aberta a novas sugestões? Se sim, isso ajudaria você?
Ah, e caso o C deva ser convertido para minúsculas:
Como uma visão geral:
fonte
'^C'
?^
que foi usado em algumas outras respostas aqui também. Obrigado pela resposta e explicação.