2011-11-10 15 views
9

He sed comando que es muy largo¿Se puede romper un comando sed largo en varias líneas?

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 

¿Se puede dividir en varias líneas para que sea más claro lo que hace?

E.g. ¿algo como?

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 

Respuesta

4

Un par de formas puedes hacer esto más pequeño. Si se acaba añadiendo el texto al final de la línea, se puede usar sed como esto:

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

De lo contrario, las variables de uso de la cáscara para dividirlo un poco.

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

¿Qué es s/$/significa después de la aguja? ¿Puedes explicar un poco más? – Bytemain

+0

@Jitamaro: 's/$/xxx /' es una forma de agregar 'xxx' al final de la línea. En una expresión regular '$' coincide con el final de la línea. También puede hacer 's/^/xxx /' para anteponer 'xxx' al comienzo de la línea. – camh

+0

y que es s /? – Bytemain

1

Sí se puede, simplemente citar como de costumbre:

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

Bueno, realmente no. De hecho, debe usar la semi columna ';' para separar los comandos si están en la misma línea. Si los comandos están en líneas diferentes, entonces no es necesario el ';' (pero no va a doler si está allí). –

+0

El problema es cómo romper la parte de la expresión regular. En el ejemplo, las cadenas de búsqueda y reemplazo son muy largas, por lo que me gustaría romperlas. –

+0

esto es un corte de 2 acciones y la solicitud está a punto de cortar una sola acción ///. – NeronLeVelu

1

expresión regular no tiene la intención de utilizar dicha expresión a largo, por qué no el acceso directo de la aguja de esta manera:

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

Sandra, alternativamente puede poner ese gran comando sed en un archivo, por ejemplo tftp.sed e invocar sed como sed -i -f tftp.sed /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default donde tftp.sed archivo que parece:

# 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 

Como se puede ver arriba, puede tener múltiples comandos sed dentro del archivo fuente sed, solo asegúrese de que estén cada uno en una línea separada.

+0

aunque no repita la solicitud (cortando la acción 'única' de long sed), esta es una posible alternativa si la solicitud se debe a una línea demasiado larga para escribir en una línea de comando, no si está en un script. – NeronLeVelu

2

Esto podría funcionar para usted:

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. la & en el lateral derecho de la sustitución representa la totalidad de la expresión regular coincidente en el lado de la mano izquierda

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

puede utilizar la barra invertida habitual para la difusión de la expresión en varias líneas. Sin embargo, es importante que las líneas que siguen a una barra invertida no tengan un espacio al principio.

sed 's'/\ 
'[long1]'\ 
'[long2]'\ 
'/'\ 
'[long3]'\ 
'[long4]'\ 
'/' file.txt 
Cuestiones relacionadas