Acrescentar no final da linha usando sed

2

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?

    
por GypsyCosmonaut 03.07.2017 / 23:11

5 respostas

4

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 /
por 03.07.2017 / 23:17
8

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.

    
por 03.07.2017 / 23:27
6

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/
    
por 03.07.2017 / 23:17
1

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.

    
por 03.07.2017 / 23:17
1

Você está fazendo duas coisas com sed aqui:

  1. substituindo todos os pontos por barras e
  2. adicionando uma barra ao final da linha

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"
    
por 04.07.2017 / 08:42

Tags