Estou aprendendo Bash e quero substituir caracteres de espaço por outros caracteres "não em branco". Estou usando um for
loop:
for f in *\ *; do mv "$f" "${f// /_}"; done
Minha pergunta é: por que estão a barra dupla e o espaço ${f// /_}
? O que ${f// /_}
faz?
Respostas:
Esse é um padrão de substituição usando a
bash
expansão de parâmetros.Em
${f// /_}
:As barras duplas
//
são para substituir todas as ocorrências de espaço por_
, se você colocar uma barra/
, apenas o primeiro espaço será substituídoO espaço existe porque você está substituindo o espaço (com sublinhado)
Portanto, o padrão é basicamente:
Marque
man bash
para ter mais ideia.Para acessar a
Parameter Expansion
seção deman bash
uma só vez:fonte
A seção
"{f// /_}
significa substituir todos os espaços com e sublinhado. Isso está usando a expansão do parâmetro Bash, a variávelf
definida nofor f in *\ *;
será executada para cada correspondência de expansão do shell (globbing). Cada vez que o nome do arquivo encontrado se tornará o valor$f
.A expansão do parâmetro funciona com o
//
significado de cada ocorrência do caractere a seguir//
(espaço neste exemplo), deve ser substituída pelo caractere depois/
(sublinhado neste exemplo).fonte