2009-11-25 18 views
19

Bastante seguro Me falta algo obvio.Eliminar usando un delimitador diferente

$ cat test.txt 
    00 30 * * * /opt/timebomb.sh >> timebomb.log 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 
$ sed ':timebomb:d' test.txt 
    00 30 * * * /opt/timebomb.sh >> timebomb.log 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

mientras que

$ sed '/timebomb/d' test.txt 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

¿Por qué es el caso? ¿No se admite un conjunto diferente de delimitadores para el comando d?

+0

duplicado posible de [Utilice barras de sed reemplazar] (http://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace) – tripleee

Respuesta

30

Los delimitadores // que está utilizando no son para el comando d, son para el direccionamiento. Creo que los está comparando con las barras en el comando s/// ... Sin embargo, aunque ambos se relacionan con expresiones regulares, son contextos diferentes.

La dirección (que aparece antes de el comando) Filtros qué líneas se aplica el comando a ... Las opciones (que aparecen después de el comando) se utilizan para controlar la sustitución aplicada.

Si desea utilizar diferentes delimitadores para una expresión regular en la dirección, es necesario comenzar la dirección con una barra invertida:

$ sed '\:timebomb:d' test.txt 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

(Para entender la diferencia entre la dirección y las opciones, considere la salida del comando:

$ sed '/timebomb/s/log/txt/' test.txt 

la dirección elige sólo la línea (s) que contiene la expresión regular timebomb, pero las opciones diga el comando s para reemplazar la expresión regular log con txt.)

1

Los dos puntos preceden a una etiqueta en sed, por lo que su programa sed se ve como un par de etiquetas sin que ocurra nada. El analizador puede ver dos puntos como delimitadores si va precedido por el comando s, por lo que es un caso especial.

0

uso gawk

gawk '!/timebomb/' file > newfile 
0

sólo puede utilizar la cáscara, sin necesidad de herramientas externas

while read -r line 
do 
    case "$line" in 
     *timebomb*) continue;; 
     *) echo "$line";; 
    esac   
done <"file" 
Cuestiones relacionadas