Come posso sostituire l'ultima occorrenza di un carattere in una stringa usando sed?


31

Come posso sostituire solo l'ultima occorrenza di "-" in una stringa con uno spazio usando sed?

Per esempio:

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

ma voglio ottenere il seguente output (sostituendo l'ultimo trattino [“-“] con uno spazio)

swp-RedHat-Linux-OS-5.5.0.0 03

Risposte:


48

Puoi farlo con un singolo sed:

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

oppure, usando l'espressione regolare estesa:

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

Il punto è che sedè molto avido, quindi abbina quanti più personaggi -possibile, inclusi altri -.

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

2
Nota, questo non è portatile. Alcune versioni non GNU di sednon supportano le corrispondenze di pattern. In tal caso, avrai bisogno di qualcos'altro, sia esso perl -pne 's/(.*)-/$1 /'la soluzione di espansione dei parametri di @ Thor o qualcos'altro.
Adam Katz,

ovviamente :-) grazie ...
Greg

Non dovresti dover sfuggire a queste parentesi quadre quando usi le virgolette singole.
jgmjgm,

@jgmjgm È possibile omettere le barre rovesciate utilizzando l'espressione regolare estesa con sed -r.
jimmij,

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


11

Qualcosa del genere ha funzionato per me, anche se sono sicuro che ci sono modi migliori

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

Questo è male ... semplicemente cattivo. Perché 4 operazioni quando puoi fare 2?
Joshpbarron,

7
Per qualcuno con solo una conoscenza di base delle espressioni regolari, questa risposta sembra molto più accessibile. E a chi importa quante operazioni sono necessarie, questo sarà istantaneo per tutti i casi pratici. Quindi prenderei in considerazione la leggibilità rispetto ad alcune regole arbitrarie per utilizzare il minor numero di operazioni possibile.
Psirus

5
@Psirus Spero che questo non aprirà una lattina di worm, ma l'idea di utilizzare operazioni minori è mostrare un certo livello di padronanza delle operazioni minori . Ad esempio, la risposta di @ Thor mostra un apprezzamento della bashfunzione di espansione dei parametri, che funziona bene se anche OP sta usando bash. Ci sarà un delicato equilibrio tra la leggibilità (al punto di essere molto dettagliata) e l'uso degli strumenti giusti, ma il più delle volte prevale il non utilizzo degli strumenti giusti.
hjk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.