2011-11-10 15 views
9

Ho sed comando che è molto lungoUn comando long sed può essere interrotto su più righe?

sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

Può essere spezzata su più righe per renderlo più chiaro che cosa fa?

E.g. qualcosa di simile a?

sed -i 's/ 
append ro initrd=initrd.img quiet splash nbdport=2000 
/
append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d 
/g' 
/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

risposta

4

Un paio di modi in cui puoi renderlo più piccolo. Se sono solo aggiungendo il testo alla fine della linea, è possibile utilizzare sed come questo:

sed -i '/append ro initrd=initrd.img quiet splash nbdport=2000/s/$/ video=LVDS-1:d' ... 

In caso contrario, le variabili di shell uso di dividerlo un po '.

PXE_BOOT_FILE=/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 
SEARCH_PATTERN='append ro initrd=initrd.img quiet splash nbdport=2000' 
REPLACE_PATTERN="$SEARCH_PATTERN video=LVDS-1:d" 
sed -i "s/$SEARCH_PATTERN/$REPLACE_PATTERN/g" "$PXE_BOOT_FILE" 
+0

Cosa significa s/$/dopo l'ago? Puoi spiegare un po 'di più? – Bytemain

+0

@Jitamaro: 's/$/xxx /' è un modo per aggiungere 'xxx' alla fine della riga. In una regex '$' corrisponde alla fine della riga. Puoi anche fare 's/^/xxx /' per anteporre 'xxx' all'inizio della riga. – camh

+0

e che cos'è s /? – Bytemain

1

Sì, si può, basta citare come al solito:

sed 's/foo/bar/g 
    s/baz/quux/g' 
+0

Beh, non proprio. In effetti, devi usare la colonna semi ';' per separare i comandi se si trovano sulla stessa riga. Se i comandi sono su linee diverse, non c'è bisogno di ';' (ma non farà male se è lì). –

+0

Il problema è come interrompere la parte regex. Nell'esempio la ricerca e la sostituzione stringono molto a lungo, quindi sono quelli che vorrei rompere. –

+0

questo è un taglio di 2 azioni e la richiesta sta per tagliare una singola azione // /. – NeronLeVelu

1

Regex non è destinata ad utilizzare tale espressione a lungo, perché non scorciatoia l'ago in questo modo:

sed -i 's/nbdport=2000/nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 
0

Sandra, in alternativa è possibile mettere quel grande comando sed in un file, ad esempio tftp.sed e invocare sed come sed -i -f tftp.sed /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default dove tftp.sed del file si presenta come:

# my very long line: 
s/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g 
# note: every sed command in this file must be in a separate line 

Come potete vedere sopra, si può avere più comandi sed all'interno del file sorgente sed, assicurati che siano ciascuno in una riga separata.

+0

anche se non risponde alla richiesta (tagliando l'azione 'single' a lungo sed), questa è una possibile alternativa se la richiesta è dovuta a una linea troppo lunga per scrivere su una riga di comando, non se è in uno script. – NeronLeVelu

2

Questo potrebbe funzionare per voi:

sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/& video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

o

string="append ro initrd=initrd.img quiet splash nbdport=2000" 
sed -i 's/'"$string"'/& video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

N.B. il & nel Lato Destro della sostituzione rappresenta tutte le regex corrispondente sul lato sinistro

5
sed 's/[long1][long2]/[long3][long4]/' file.txt 

è possibile utilizzare la solita barra rovesciata per diffondere l'espressione su più righe. È importante però che le righe che seguono una barra rovesciata non contengano uno spazio all'inizio.

sed 's'/\ 
'[long1]'\ 
'[long2]'\ 
'/'\ 
'[long3]'\ 
'[long4]'\ 
'/' file.txt 
Problemi correlati