Eu preciso ser capaz de substituir um espaço ( ) por um ponto (
.
) em uma string no bash.
Eu acho que isso seria bem simples, mas sou novo, portanto não consigo descobrir como modificar um exemplo semelhante para esse uso.
Use a substituição de cadeia de shell em linha. Exemplo:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Veja http://tldp.org/LDP/abs/html/string-manipulation.html para mais detalhes.
tr
strings longas. No meu sistematr
supera o bash começando em strings com mais de1000
caracteres. Parece que a complexidade do tempo do bash é pior que linear. Um pequeno teste:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Com um comprimento de string de 1M (= 2 ^ 20),tr
levou0.04s
e o bash 5.0.11 levou17s
. Com 2Mtr
levou0.07s
(esperado), mas o bash levou69s
(4 vezes mais que o dobro do comprimento da string).tr
! ... Dependendo da memória disponível e dos recursos hw ... Mas você está certo !: Dependendo do tipo de trabalho a ser feito, as ferramentas dedicadas permanecem mais eficientes!$'\n'
Você poderia usar
tr
, assim:Exemplo:
De
man tr
:fonte
No bash, você pode fazer a substituição de padrões em uma sequência com a
${VARIABLE//PATTERN/REPLACEMENT}
construção. Use apenas/
e não//
para substituir apenas a primeira ocorrência. O padrão é um padrão curinga, como globs de arquivo.fonte
Tente isto
fonte
Use substituição de parâmetro:
fonte
Tente isto para caminhos:
Ele substitui o espaço dentro da sequência de aspas duplas por um
+
canto, substitui o+
sinal por uma barra invertida e remove / substitui as aspas duplas.Eu tive que usar isso para substituir os espaços em um dos meus caminhos em Cygwin.
fonte
sed
. As aspas são irrelevantes.