Comment remplacer la dernière occurrence d'un caractère dans une chaîne à l'aide de sed?

31

Comment remplacer uniquement la dernière occurrence de "-" dans une chaîne par un espace utilisant sed?

Par exemple:

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

mais je veux obtenir la sortie suivante (en remplaçant le dernier tiret [“-“] par un espace)

swp-RedHat-Linux-OS-5.5.0.0 03
maihabunash
la source

Réponses:

48

Vous pouvez le faire avec un seul sed:

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

ou, en utilisant une expression régulière étendue:

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

Le fait est que sedc'est très gourmand, donc correspond autant de caractères -que possible avant , y compris d'autres -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03
Jimmij
la source
2
Notez que ce n'est pas portable. Certaines versions non GNU de sedne prennent pas en charge les correspondances de modèles. Dans ce cas, vous aurez besoin d'autre chose, que ce perl -pne 's/(.*)-/$1 /'soit la solution d'expansion des paramètres de @ Thor ou autre chose.
Adam Katz
bien sûr :-) thx ...
Greg
Vous ne devriez pas avoir besoin d'échapper à ces crochets lorsque vous utilisez des guillemets simples.
jgmjgm
@jgmjgm Vous pouvez omettre les barres obliques inverses en utilisant l'expression régulière étendue avec sed -r.
jimmij
1
@VinayPotluri Essayez sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij
27

Vous pouvez également gérer cela avec l' expansion des paramètres bash :

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

Sortie:

swp-RedHat-Linux-OS-5.5.0.0 03
Thor
la source
Très créatif, j'adore cette réponse
dpritch
11

Quelque chose comme ça a fonctionné pour moi, même si je suis sûr qu'il existe de meilleures façons

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
rahul
la source
C'est mauvais ... tout simplement mauvais. Pourquoi faire 4 opérations quand vous pouvez en faire 2?
Joshpbarron
7
Pour quelqu'un qui n'a qu'une compréhension de base des expressions régulières, ces réponses semblent beaucoup plus accessibles. Et peu importe combien d'opérations cela prend, cela va être instantané pour tous les cas pratiques. Je considérerais donc la lisibilité sur une règle arbitraire pour utiliser le moins d'opérations possible.
Psirus
5
@Psirus J'espère que cela n'ouvrira pas une boîte de vers, mais l'idée d'utiliser des opérations moindres est de montrer un certain niveau de maîtrise des opérations moindres . Par exemple, la réponse de @ Thor montre une appréciation de la bashfonction d'extension des paramètres, qui fonctionne bien si OP l'utilise bashégalement. Il y aura un équilibre délicat entre la lisibilité (au point d'être très verbeux) et l'utilisation des bons outils, mais le plus souvent, l'utilisation des bons outils prévaut.
hjk