2011-08-13 10 views
8

Me gustaría dar una palabra clave, encontrar la línea donde aparece esta palabra clave en un archivo y borrar toda la línea.Bash: busque una palabra clave en un archivo y elimine su línea

Esto es lo que tengo, pero no está funcionando como debiera:

KEYWORD='domain.com' 
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts 

ACTUALIZACIÓN

Esto es lo que funcionó para mí:

sed -i_bak -e '/domain\.com/d' /etc/hosts

Sin embargo, como tenía dos líneas con "domain.com", ¿hay alguna manera de decirle a sed que borre solo la línea donde está exactamente la clave? ord "domain.com" aparece

Este es el contenido original de/etc/hosts:

127.0.0.1  localhost  localhost.localdomain 
222.111.22.222  hvn.domain.com 
222.111.22.222  domain.com 

Así es como terminan después del comando sed -i_bak -e '/domain\.com/d' /etc/hosts:

127.0.0.1  localhost  localhost.localdomain 

intenté pero sed -i_bak -e '/\<namourphoto\.com\.br\>/d' ~/Desktop/hosts no funcionó

CONCLUSIÓN

Este es el código que se me ocurrió (basado en la ayuda a la gente fina me han dado):

D=domain.com 
DOMAIN=`echo "$D" | sed 's/\./\\\\./g'` 
sed -i_bak -e "/[\t]$DOMAIN/d" /etc/hosts 

Tenga en cuenta que:

  • I Estoy contando que siempre hay una pestaña antes de que el dominio se borre

  • Estoy escapando automáticamente de los puntos del nombre de dominio.

+2

Tenga en cuenta también que el punto tiene un significado especial en las expresiones regulares de modo 'domain.com' también coincidirá' domainxcom.net'. Deberías escapar del punto. – duri

+0

¿Debo escapar de puntos incluso cuando estoy entre ''? – Roger

+0

Sí, lo haces. Prueba 'echo abc | grep 'a.c'', la salida será 'abc'. – duri

Respuesta

13

Uso del stream editor, sed:

sed -i ".bak" '/culpa/d' test.txt 

Lo anterior borrar las líneas que contienen culpa en test.txt. Creará una copia de seguridad del original (llamado test.txt.bak) y modificará el archivo original in situ.

+0

eso es increíble. – djhaskin987

+1

Mis pruebas no funcionaron con el espacio entre -i y .bak. Pero cuando pu-i.bak funcionó. – Roger

+0

¿cómo se hace esto mientras se descarta el original sin hacer una copia de seguridad? ACTUALIZACIÓN: acaba de hacer la cita ".bak" en blanco para responder a mi propia pregunta. –

5

Pipe en otro archivo, no es lo mismo que usted está leyendo desde, y tener cuidado con el uso inútil de cat.

grep -v "$KEYWORD" /etc/hosts > newfile 

Además de la multa respuesta dada en relación con sed, también se puede utilizar Perl y un poco mejorada de expresiones regulares para resolver esto:

perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file 

Aviso estoy considerando domain.com quedarán aislados por caracteres de espacio (pestañas o espacios, etc.), y que nada más que cero o más espacios aparecerán después de él hasta la nueva línea. De manera similar a -i en sed,
-i.old en perl establece la variable $^I, y su archivo original recibirá los cambios mientras que una copia se mantendrá bajo el nombre anterior y se agregará un .old.

+0

¿Hay alguna manera de editar en el lugar con este enfoque o siempre necesito hacer otro archivo para editarlo? – Roger

+0

@Roger, actualicé la respuesta. – sidyll

+0

Muy elegante su código, gracias. – Roger

1

Si sólo desea borrar la última línea de su archivo de ejemplo

sed -i '/[[:space:]]\+domain\.com/d' test.txt 
Cuestiones relacionadas