sed abordagem:
s="org.gnome.Terminal.Legacy.Keybindings"
g=$(echo $s | sed "y|.|/|; s|$|/|")
echo $g
org/gnome/Terminal/Legacy/Keybindings/
-
y|\.|/|
- traduzir todos os pontos.
para barras/
Já vi outras respostas tentando resolver meu problema, mas não consigo resolvê-lo.
#!/bin/bash
s=org.gnome.Terminal.Legacy.Keybindings
g=$(echo $s | sed "s|\.|/|g")
echo $g
Eu tenho um script acima que retorna
org/gnome/Terminal/Legacy/Keybindings
mas preciso anexar /
no final para que se torne
org/gnome/Terminal/Legacy/Keybindings/
Como estender meu script sed para isso?
Você não precisa de sed para isso, se estiver usando o bash.
s="org.gnome.Terminal.Legacy.Keybindings"
g=${s//.//}/
Leia a seção Expansão do Parâmetro da página man do bash ( ${parameter/pattern/string}
), também tem muitas outras coisas úteis.
Com sed, você também pode especificar várias expressões, às vezes é mais legível.
s="org.gnome.Terminal.Legacy.Keybindings"
g=$(sed -e 'y,.,/,' -e 's,$,/,' <<<$s)
Note que com o comando y
você não precisa escapar do comando .
, y
aceita caracteres literais.
Tente isto:
sed 's/\.\|$/\//g'
|
é o operador de alternação. $
corresponderá ao fim da linha. Demo:
%echo org.gnome.Terminal.Legacy.Keybindings|sed 's/\.\|$/\//g'
org/gnome/Terminal/Legacy/Keybindings/
Você poderia fazer
#!/bin/bash
s=org.gnome.Terminal.Legacy.Keybindings
g=$(echo $s | sed "s|\.|/|g")
echo $(echo "$g" | sed 's@$@/@')
procura o final da linha ( $
) e substitui por /
.
@
é um separador alternativo.
Você está fazendo duas coisas com sed
aqui:
A primeira tarefa pode ser feita pelo sed
command y#.#/#
. O comando y
é semelhante a como o utilitário tr
funciona, pois substitui caracteres de uma sequência para outra sem envolver expressões regulares. Os três #
são delimitadores para o comando (geralmente usa /
, como em y/A-Z/a-z/
para minúscula todos os caracteres no intervalo A-Z
), mas assim como com o comando s
, podemos usar qualquer delimitador nós queremos.
A segunda tarefa pode ser feita substituindo o final da linha por uma barra usando s#$#/#
.
Colocando tudo junto, conseguimos
sed -e 'y#.#/#' -e 's#$#/#'
No seu script:
#!/bin/bash
s='org.gnome.Terminal.Legacy.Keybindings'
g=$( sed -e 'y#.#/#' -e 's#$#/#' <<<"$s" )
printf '%s\n' "$g"
Isso produz
org/gnome/Terminal/Legacy/Keybindings/
É claro que a barra pode ser colocada pelo printf
e as substituições dos pontos por barras podem ser feitas com tr
também:
#!/bin/bash
s='org.gnome.Terminal.Legacy.Keybindings'
g=$( tr '.' '/' <<<"$s" )
printf '%s/\n' "$g"