Como substituo a última ocorrência de um caractere em uma string usando sed?


31

Como substituo apenas a última ocorrência de "-" em uma string por um espaço usando sed?

Por exemplo:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

mas quero obter a seguinte saída (substituindo o último hífen [“-“] por um espaço)

swp-RedHat-Linux-OS-5.5.0.0 03

Respostas:


48

Você pode fazer isso com single sed:

sed 's/\(.*\)-/\1 /'

ou, usando expressão regular estendida:

sed -r 's/(.*)-/\1 /'

O ponto é que sedé muito ganancioso, portanto, corresponde ao maior número de caracteres -possível, incluindo outros -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03

2
Observe que isso não é portátil. Algumas versões não-GNU sednão suportam correspondências de padrões. Nesse caso, você precisará de outra coisa, seja perl -pne 's/(.*)-/$1 /'a solução de expansão de parâmetros do @ Thor ou outra coisa.
23415 Adam

é claro :-) thx ...
Greg

Você não precisa escapar desses colchetes ao usar aspas simples.
Jgmjgm

@jgmjgm Você pode omitir barras invertidas usando a expressão regular estendida com sed -r.
jimmij

11
@VinayPotluri Try sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij


11

Algo assim funcionou para mim, embora eu tenha certeza de que existem maneiras melhores

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03

Isso é ruim ... muito ruim. Por que 4 operações quando você pode fazer 2?
Joshpbarron

7
Para alguém com apenas um entendimento básico de expressões regulares, essas respostas parecem muito mais acessíveis. E quem se importa com quantas operações são necessárias, isso será instantâneo para todos os casos práticos. Portanto, eu consideraria a legibilidade de alguma regra arbitrária para usar o menor número possível de operações.
Psirus 03/03

5
@ Psirus Espero que isso não abra uma lata de worms, mas a idéia de usar operações menores é mostrar um certo nível de domínio das operações menores . Por exemplo, a resposta de @ Thor mostra uma apreciação do bashrecurso de expansão de parâmetros, que funciona bem se o OP também estiver sendo usado bash. Haverá um delicado equilíbrio entre a legibilidade (a ponto de ser muito detalhada) e o uso das ferramentas certas, mas, na maioria das vezes, prevalecerá o uso das ferramentas certas.
HJK
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.