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

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

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.