2013-03-03 1 views
8

Sto tentando di sostituire un'espressione utilizzando sed. La regex funziona in vim ma non in sed. Sto sostituendo l'ultimo trattino prima del numero con una barra in modoBackreferences in sed restituendo valore errato

/www/file-name-1 

dovrebbe restituire

/www/file-name/1 

Sto usando il seguente comando ma mantiene l'output/www/file-name/0 invece

sed 's/-[0-9]/\/\0/g' input.txt 

Cosa sto sbagliando?

risposta

15

È necessario circondare tra parentesi i dati per fare riferimento in un secondo momento, e sed inizia a contare in 1. Per recuperare tutti i personaggi abbinato senza bisogno di parentesi, viene utilizzato il simbolo &.

sed 's/-\([0-9]\)/\/\1/g' input.txt 

che i rendimenti:

/www/file-name/1 
+0

Questa è la risposta corretta. Non ho notato @ user2052491 non stava usando le parentesi. – maljub01

+0

le barre rovesciate prima delle parentesi non sono necessarie, vero? – Blauhirn

0

Sembra sed sotto OS X inizia a contare backreference a 1. Prova \1 invece di \0

+0

se uso \ 1 restituisce "\ 1 non definito nell'IR" – user2052491

+0

OS X/macOS ha strumenti UNIX antichi. Non puoi usare '-r', il che significa che devi sfuggire alle parentesi. –

+0

Gli usi di OS X -E anziché -r per abilitare l'espressione regolare estesa – thenickdude

5

È necessario acquisire utilizzando le parentesi prima di poter eseguire il riferimento (che avviare una \1). Prova sed -r 's|(.*)-|\1/|':

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1 

è possibile utilizzare qualsiasi delimitatore con sed modo / non è la scelta migliore quando la sostituzione contiene /. L'opzione -r è per regexp estesa in modo che la parentesi non debba essere sottoposta a escape.