2012-03-02 25 views
48

Soy nuevo en sed y tengo la siguiente pregunta. En este ejemplo:sed borrar líneas que no contienen una cadena específica

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

quiero borrar todas las líneas excepto los que contienen alguna de las cadenas 'texto' y o cadena 'bla', por lo que mi archivo de salida es el siguiente:

some text here 
blah blah 123 
some other text as well 

¿Alguna sugerencia de cómo se puede hacer esto usando sed?

+3

Must la respuesta usa sed? grep haría esto muy fácilmente. – Tim

Respuesta

11

Desea imprimir solo aquellas líneas que coincidan con 'texto' o 'blah' (o ambos), donde la distinción entre 'y' y 'o' es bastante crucial.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

Los medios -n no se imprimen por defecto. El primer patrón busca 'texto', lo imprime si coincide y salta a la siguiente línea; el segundo patrón hace lo mismo para 'blah'. Si la 'n' no estaba allí, una línea que contenía 'texto y bla' se imprimiría dos veces. Aunque podría haber usado solo -e '/blah/p', la simetría es mejor, especialmente si necesita ampliar la lista de palabras coincidentes.

Si su versión de sed soporta expresiones regulares extendidas (por ejemplo, GNU sed hace, con -r), entonces se puede simplificar eso a:

sed -r -n -e '/text|blah/p' your_data_file 
+3

Si sed no es compatible con '-r', probablemente tampoco sea compatible con' {} '. Esto debería funcionar con seds antiguos: 'sed '/ text \ | blah /! D' file' –

+0

La agrupación' {...} 'de comandos estaba en la 7ª edición de la versión UNIX de' sed'; No puedo pensar cómo te topaste con una versión en la que eso no fue apoyado. –

79

Esto podría funcionar para usted:

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

Gracias, eso funciona. – user1246172

+1

¿Cómo puedo, por ejemplo, especificar que el texto o bla solo pueden aparecer en la última columna? – discipulus

+2

@lovedynasty Si quiere decir * al final de la línea *, debe usar '$': ''/ text $ \ | blah $ /! D'' – Melebius

5

simplemente podría hacerlo a través de awk,

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well 
Cuestiones relacionadas