2009-11-25 12 views
19

Ziemlich sicher, ich vermisse etwas offensichtlich!Löschen mit einem anderen Trennzeichen

$ 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 

während

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

Warum ist es so? Wird für den Befehl d kein anderer Trennzeichensatz unterstützt?

+0

Mögliche Duplikat [Verwendung in Schrägstriche sed ersetzen] (http://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace) – tripleee

Antwort

30

Die Trennzeichen //, die Sie verwenden, sind nicht für den Befehl d, sie dienen zur Adressierung. Ich denke, Sie vergleichen sie mit den Schrägstrichen im s/// Befehl ... Obwohl beide sich auf reguläre Ausdrücke beziehen, sind sie unterschiedliche Kontexte.

Die Adreßfilter (die vor der Befehl angezeigt wird), die Zeilen der Befehl angewendet wird ... Die Optionen (die nach der Befehl angezeigt werden) werden verwendet, angewendet, um den Ersatz zu steuern.

Wenn Sie verschiedene Trennzeichen für einen regulären Ausdruck in der Adresse verwenden möchten, müssen Sie die Adresse mit einem Backslash starten:

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

(Um die Differenz zwischen der Adresse zu verstehen und die Möglichkeiten, betrachten die Ausgabe des Befehls:

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

die Adresse wählt nur die Zeile (n) timebomb den regulären Ausdruck enthält, aber die Optionen sagen dem s Befehl den regulären Ausdruck ersetzen log mit txt.)

1

Der Doppelpunkt geht einem Etikett in sed voraus, also sieht Ihr sed Programm wie einige Aufkleber mit nichts vor. Der Parser kann Doppelpunkte als Trennzeichen sehen, wenn ihm der Befehl s vorangestellt ist. Dies ist ein Sonderfall.

0

Verwendung gaffen

gawk '!/timebomb/' file > newfile 
0

Sie nur die Shell verwenden können, keine Notwendigkeit, externe Tools

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