Tengo que reemplazar un gran bloque de texto (código de script de shell) en un archivo con otro bloque de texto.
Estoy impresionado con ¿Cómo puedo usar sed para reemplazar una cadena de varias líneas? respondido por
antak y reemplazo de varias líneas respondido por Bruce Ediger
Pero tengo algunos problemas para usarlos.
-
Antak ya mencionó en su respuesta que transmitir el archivo completo (
1h;2,$H;$!d;g;
) al búfer no es recomendable para archivos grandes, porque sobrecarga la memoria. -
Sé
sed
se puede utilizar con la función de bloque para conservar el texto fuera del bloque sin cambios. Quiero usar esta función. Pero si uso,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
insertará texto nuevo (código) repetidamente para cada transmisión. Por lo tanto, tengo que hacer el bloque visual como una transmisión, usando algo similar a lo que sugirió antak anteriormente, pero para el bloque (no para todo el archivo).
-
Como lo mencionó Bruce Ediger, agregue la característica de
ex
que comienzan cona
terminar con.
(punto) se puede probar, pero mi nuevo texto (código) contiene líneas que comienzan con un punto, que puede considerarse como el punto de la sintaxis adjunta. ¿Cómo puedo usarlo en esta situación? -
ex
'sdd
'número de líneas' puede eliminar varias líneas, pero si tengo un bloque entre /marcador1/ y /marcador2/ con el número de líneas no fijo (varía) debe ser reemplazado con texto nuevo (código), ¿cómo hacerlo?
Respuesta aceptada:
Sugiero usar la c comando hange
(que es esencialmente una d elete junto con un a ppend, aunque la adición solo se aplica a la última línea del rango, que es exactamente lo que quiere aquí):
sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename
Aquí usando GNU sed
sintaxis para la edición in situ (-i
). Que c
por lo demás, el comando es estándar y portátil. GNU sed
admite:
sed '/marker1/,/marker2/cNew text 1
New text 2' filename
como una extensión no estándar.
Los caracteres de nueva línea y barra invertida se deben escapar (con barra invertida) en el texto de reemplazo.