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
maihabunash
fonte

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
jimmij
fonte
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
27

Você também pode lidar com isso com a expansão do parâmetro bash :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Saída:

swp-RedHat-Linux-OS-5.5.0.0 03
Thor
fonte
Muito criativo, amo esta resposta
dpritch
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
rahul
fonte
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