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.
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.
Respostas:
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
! ... 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:
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).