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.
Você poderia usar tr
, assim:
tr " " .
Exemplo:
# echo "hello world" | tr " " .
hello.world
De man tr
:
DESCRIÇÃO
Traduza, comprima e / ou exclua caracteres da entrada padrão, gravando na saída padrão.
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.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Use substituição de parâmetro:
string=${string// /.}
Tente isto para caminhos:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
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.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. As aspas são irrelevantes.
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'