2012-03-27 8 views
6

tratando de hacer esto:insert de sed después de SÓLO la primera línea coincide?

sed -e '/^MatchMeOnce/i\ 
MATCHED' 

en el texto ejemplo:

Line1 
Line2 
MatchMeOnce 
Line4 
MatchMeOnce 
Line6 

¿Cómo puedo conseguir que solamente coincida con la primera ocurrencia de registros y para no partido en líneas posteriores?

Line1 
Line2 
MATCHED 
Line4 
MatchMeOnce 
Line6 

Respuesta

1

sed GNU ha el comando t a ramificarse a extremo de escritura (alternativamente una etiqueta dada) cuando cualquier sustitución coincide.

Personalmente utilizo perl -ne y perl -ane (y supongo que algunas personas usan Ruby) a menos que la solución awk o sed sea absolutamente obvia. Pero me doy cuenta de que aún es posible que algunos sistemas tengan awk y sed sin Perl y dificulten la instalación de Perl; y que algunos programadores prefieren awk y sed independientemente.

2

sed (no tan obvio):

sed '1,/^MatchMeOnce$/ {/^$/\c 
MATCHED 
}' 

awk (obvio):

BEGIN { 
    matched = 0 
} 
/^MatchMeOnce$/ { 
    if (matched == 0) { 
     print "MATCHED" 
     matched = 1 
     next 
    } 
} 
{ print } 

perl también es cool ...

espero que más o menos funciona :-)

+1

sed: -e expresión # 1, char 24: comando desconocido: '\ ' – kev

2
$ sed '/MatchMeOnce/{s//MATCHED/;:a;n;ba}' input.txt 
Line1 
Line2 
MATCHED 
Line4 
MatchMeOnce 
Line6 
7

Esto podría funcionar para usted:

sed '1,/MatchMeOnce/s//MATCHED/' file 

Esto funcionará para todas las variaciones de sed, siempre y cuando MatcMeOnce está en la segunda línea o mayor, o esto (GNU sed):

sed '0,/MatchMeOnce/s//MATCHED/' file 

cuales atiende a la condición anterior borde:

O otra alternativa (todo de sed), que sorbe todo el archivo en la memoria:

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/' file 

que tiene la ventaja añadida de que si usted quiere elegir el enésimo lugar de la primera de todo lo que necesita hacer MatchMeOnce es cambiar la bandera ocurrencia es decir, para cambiar la segunda aparición:

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/2' file 

Para cambiar el último uso de ocurrencia:

sed ':a;$!{N;ba};s/\(.*)MatchMeOnce/\1MATCHED/' file 
Cuestiones relacionadas