2012-03-06 31 views
9

En Linux, ¿qué comando puedo usar para reemplazar una sola línea de texto con nuevas líneas múltiples? Quiero buscar una palabra clave en una línea y eliminar esta línea y reemplazarla con múltiples líneas nuevas. Entonces, en el texto que se muestra a continuación, quiero buscar la línea que contiene "palabra clave" y reemplazar toda la línea con 3 nuevas líneas de texto, como se muestra.Sustituir una sola línea con múltiples líneas de texto

Por ejemplo la sustitución de la línea que contiene la palabra clave,

This is Line 1 
This is Line 2 that has keyword 
This is Line 3 

cambiado a esto:

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 
+2

¿tiene la intención de reemplazar un número de línea específico o la (s) línea (s) que coinciden con "^ This is Line 2 $"? cualquiera se puede hacer con sed – technosaurus

+0

Las líneas coinciden. No estoy seguro de cómo reemplazar una sola línea coincidente con líneas múltiples como se muestra con sed. – SSS

+1

Actualicé el original para mayor claridad. – SSS

Respuesta

12
$ sed '/keyword/c\ 
> Inserted is new first line\ 
> Inserted is new second line\ 
> Inserted is new third line' input.txt 

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 

$ y > son bash

+2

¿Cómo lo cronometra para que después de una hora sin que nadie conteste la pregunta, logre enviar su respuesta solo un minuto antes que la mía! –

+2

puramente una coincidencia – kev

+1

¡Gracias! Esto me estaba volviendo loco de bateo ... b/c '\ n' no funcionaba. – SaxDaddy

8

Crear un archivo, script.sed, que contiene:

/keyword/{i\ 
Inserted is new first line\ 
Inserted is new second line\ 
Inserted is new third line 
d 
} 

aplicarla a sus propios datos:

sed -f script.sed your_data 

Hay numerosas variaciones en la forma de hacerlo, utilizando los c y a comandos en lugar de i y/o d, pero esto es bastante limpio. Encuentra la palabra clave, inserta tres líneas de datos y luego elimina la línea que contiene la palabra clave. (El comando c hace que todos, pero yo no recordaba que existía, y el comando a añade el texto y es esencialmente sinónimo de i en este contexto.)

+0

¿Se puede incrustar en un solo script bash? Prefiero guardarlo en un solo archivo. – flickerfly

+1

@flickerfly: Sí, se puede hacer sin el archivo separado. Sin embargo, generalmente es más fácil con el archivo. Depende en parte de lo que hay en las líneas que se insertarán, pero si incluyen texto como "Dijo," ¡No lo hagas! No debes hacerlo, ni siquiera por $ 100 ". ', El manejo en un script de shell se convierte en un verdadero dolor (tienes que escapar de algunas de las citas, de alguna manera), pero es casi trivial con el archivo separado 'script.sed'. Para texto sin formato, simplemente coloque todo el script dentro de comillas simples. Necesitas las barras diagonales inversas, 'sed' debe verlas. Si tiene que usar comillas dobles, deberá doblar las barras diagonales inversas. –

+1

Por cierto, [kev] (http://stackoverflow.com/users/348785/kev) 's [respuesta] (http://stackoverflow.com/a/9576547/15168) muestra cómo se puede hacer en un solo secuencia de comandos, sin una extensa discusión de los chanchullos que podrían ser necesarios si el texto de reemplazo contiene caracteres de comillas. –

1

puede hacerlo utilizando órdenes internas también:

STRING1_WITH_MULTIPLE_LINES="your 
text 
here" 

STRING2_WITH_MULTIPLE_LINES="more 
text" 

OUTPUT="" 
while read LINE || [ "$LINE" ]; do 
    case "$LINE" in 
    "Entire line matches this")OUTPUT="$OUTPUT$STRING1_WITH_MULTIPLE_LINES 
";; 
    *"line matches this with extra before and/or after"*)OUTPUT="$OUTPUT$STRING2_WITH_MULTIPLE_LINES 
";; 
    *)OUTPUT="$OUTPUT$LINE 
";; 
    esac 
done < file 
echo "$OUTPUT" >file 
+1

no tiene que configurar las cadenas como variables fuera del bloque while-read-case ... solo pueden ser OUTPUT = "$ OUTPUTyour \ ntext \ nhere" ... reemplazando las \ n con nuevas líneas reales – technosaurus

Cuestiones relacionadas