2012-04-02 15 views
7

ACTUALIZADO:sed que inserte el primer partido solamente

usando sed, ¿cómo se puede insertar I (NO SUSTITUIR) una nueva línea sólo en el primer partido de la palabra clave para cada archivo.

Actualmente Tengo el siguiente pero esta inserta por cada línea que contiene palabra clave de concordancia y yo quiero que sólo se inserte la nueva línea insertada sólo para el primer partido que se encuentra en el archivo:

sed -ie '/Matched Keyword/ i\New Inserted Line' *.* 

Por ejemplo:

Miarchivo.txt:

Line 1 
Line 2 
Line 3 
This line contains the Matched Keyword and other stuff 
Line 4 
This line contains the Matched Keyword and other stuff 
Line 6 

cambiado a:

Line 1 
Line 2 
Line 3 
New Inserted Line 
This line contains the Matched Keyword and other stuff 
Line 4 
This line contains the Matched Keyword and other stuff 
Line 6 
+0

duplicado posible de [esta cuestión] (http: // desbordamiento de pila.com/q/148451/1086804) - puede adaptarlo usando newline y backreferences. Ver también [esta guía sed] (http://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_004.html) –

Respuesta

8

Si quieres uno con sed *:

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt 

* sólo funciona con GNU sed

+1

Esto no hace nada por mí en absoluto. – Graham

+4

Ah, su solución es aparentemente específica para GNU sed. Aunque todavía está mal, ¡ay! – Graham

+0

Funciona para mí con 'GNU sed versión 4.2.1'. @Squazic, tal vez quiera calificar su respuesta. Buena suerte a todos. – shellter

8

Puede especie de hacerlo en GNU sed:

sed '0,/Matched Keyword/s//New Inserted Line\n&/' 

Pero no es portátil . Dado que la portabilidad es bueno, aquí está en awk:

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile 

O, si quieres pasar una variable a imprimir:

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile 

Estos dos inserte la línea de texto antes la primera aparición de la palabra clave, en una línea por sí mismo, según su ejemplo.

Recuerde que tanto con sed como con awk, la palabra clave coincidente es una expresión regular, no solo una palabra clave.

ACTUALIZACIÓN:

Dado que esta cuestión también está etiquetada , he aquí una solución simple que es pura fiesta y no requirió sed:

#!/bin/bash 

n=0 
while read line; do 
    if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then 
    echo "New Inserted Line" 
    n=1 
    fi 
    echo "$line" 
done 

Tal como está, esto como una tubería . Puede envolverlo fácilmente en algo que actúa en los archivos en su lugar.

+0

¿No hay una manera de hacer esto en sed tradicional? – Graham

+0

Puede ser posible adaptar la solución de potong para sedimentos que no sean GNU. Pero no será de una sola línea. Por lo general, solo hago sed de una línea. :-) – ghoti

+0

+1 Funciona muy bien con awk! Gracias –

2

Esto podría funcionar para usted:

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;$q;n;ba;}' *.* 

estás muy cerca! Simplemente cree un ciclo para leer desde el Matched Keyword hasta el final del archivo.

+0

ummm, sí, puede dar un ejemplo que funcione completamente ya que no estoy seguro de cómo crear este "bucle" en una expresión en línea sed. – johnnyB

+0

@johnnyB para crear un "bucle" utilice los siguientes cuatro comandos: ': a' un marcador de posición de bucle,' $ q' cuando se encuentre el final del archivo salido (imprimir la última línea), 'n' imprima la línea actual y luego lea en el siguiente y 'ba' break (goto) al marcador de posición en este caso' a'. – potong

0

Si desea añadir una línea después primer partido solamente, utilizar AWK en lugar de sed como a continuación

awk '{print} /Matched Keyword/ && !n {print "New Inserted Line"; n++}' myfile.txt 

Salida:

Line 1 
Line 2 
Line 3 
This line contains the Matched Keyword and other stuff 
New Inserted Line 
Line 4 
This line contains the Matched Keyword and other stuff 
Line 6 
+0

y ¿cómo se hace eso en su lugar? – sloven

Cuestiones relacionadas