Sed per invertire due parole


8
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'

L'output che mi aspetto è /usr/local/Axis2C AXIS2C_HOME=.

Non riesco a capire cosa sto facendo di sbagliato. :(

Risposte:


8

La banale risposta è "più barre rovesciate, meno spazi":

echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Ma la risposta più ampia è "aspetta, cosa stai cercando di fare?" Vuoi che le coppie chiave-valore vengano divise in variabili utili o stai davvero solo cercando di trasferire l'input nella sintassi inversa per inviarlo a qualcos'altro?


1

Hai uno spazio errato dopo il =. Provare:

sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Di seguito funziona anche ed è un po 'più breve. \1sarà qualcosa prima del primo/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'

0

Sed è eccezionale, ma anche Perl può farlo, e non richiede la foresta di barre rovesciate:

% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=

Inoltre, hai la piena potenza del motore delle espressioni regolari, in modo da poter realizzare modelli ancora più complessi.


2
Potresti anche evitare la foresta di barre rovesciate se hai una sedGNU sed che supporta espressioni regolari estese:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D

@Steven D: La foresta è mia amica ... (la metà del gioco di parole è intesa ... l'altra metà è: penso che mi sarei perso senza di loro :) ... ma ci sto pensando, ora che hai menzionato -r ... (Ci ho pensato .. Continuerò con le barre rovesciate, altrimenti perderò la capacità di capire le dichiarazioni sed di tutti gli altri :)
Peter.O
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.