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"