2009-11-25 13 views
19

Abbastanza certo, mi manca qualcosa di ovvio!Elimina utilizzando un delimitatore diverso

$ 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 

mentre

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

Perché è il caso? Non sono un diverso insieme di delimitatori supportati per il comando d?

+0

Eventuali duplicati di [Usa slash in sed sostituire] (http://stackoverflow.com/questions/5864146/use-slash-in-sed-sostituzione) – tripleee

risposta

30

I delimitatori // che si utilizzano non sono per il comando d, sono per l'indirizzamento. Penso che tu li stia confrontando con le barre nel comando s/// ... Tuttavia, sebbene entrambi si riferiscono a espressioni regolari, sono contesti diversi.

L'indirizzo (che appare prima il comando) filtri che linee il comando viene applicato a ... Le opzioni (che appaiono dopo il comando) vengono utilizzati per controllare la sostituzione applicato.

Se si desidera utilizzare diversi delimitatori per un'espressione regolare l'indirizzo, è necessario iniziare l'indirizzo con un backslash:

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

(per capire la differenza tra l'indirizzo e le opzioni, si consideri il output del comando:

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

l'indirizzo sceglie solo la linea (s) che contiene l'espressione regolare timebomb, ma le opzioni dire il comando s per sostituire l'espressione regolare log con txt.)

1

Il colon precede un'etichetta in sed, quindi il tuo programma sed sembra un paio di etichette senza che nulla accada. Il parser può vedere i due punti come delimitatori se preceduto dal comando s, quindi questo è un caso speciale.

0

uso gawk

gawk '!/timebomb/' file > newfile 
0

si può semplicemente usare la shell, senza bisogno di strumenti esterni

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