GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar Sed o Ex para reemplazar un bloque (código de varias líneas) con un nuevo bloque de texto (código)?

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.

  1. 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.

  2. 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).

  1. Como lo mencionó Bruce Ediger, agregue la característica de ex que comienzan con a 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?

  2. ex 's dd '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.


Linux
  1. Texto de archivo múltiple ¿Reemplazar con Sed?

  2. Cómo usar la exportación con Python en Linux

  3. ¿Cómo se reemplaza el texto similar a sed con python?

  4. ¿Cómo uso sed para cambiar mis archivos de configuración, con claves y valores flexibles?

  5. ¿Cómo usar sed para reemplazar la variable de un archivo de configuración?

Cómo usar sed para buscar y reemplazar cadenas en archivos

CÓMO UTILIZAR EL EDITOR SED

Los 20 mejores comandos sed para usar

Cómo usar Sed para buscar y reemplazar una cadena en un archivo

¿Cómo reemplazo las comillas simples con otro carácter en sed?

Cómo usar en un lienzo un elemento de texto con una fuente descrita en CSS