Bash - entferne alle Zeilen, die mit 'P' beginnen

7

Ich habe eine Textdatei, die etwa 300 KB groß ist. Ich möchte alle Zeilen aus dieser Datei entfernen, die mit dem Buchstaben "P" beginnen. Das habe ich benutzt:

%Vor%

Dies wird nicht an die Konsole ausgegeben. Ich kann cat für die Datei ohne weitere Befehle verwenden und es wird gut ausgedruckt. Meine letzte Absicht ist es:

%Vor%

Es erscheint kein Fehler, es wird nur nichts ausgedruckt und wenn ich den 2. Befehl ausführe, ist new.txt leer. Ich sollte sagen, dass ich Windows 7 mit Cygwin installiert habe.

    
user2450099 20.06.2013, 08:35
quelle

5 Antworten

10

Erklärung

  1. Verwende ^ , um dein Muster am Anfang der Zeile zu verankern;
  2. Löschen Sie mit sed übereinstimmende Zeilen und die d -Flagge .

Lösung # 1

%Vor%

Bessere Lösung

Verwenden Sie sed -only:

%Vor%     
Édouard Lopez 20.06.2013, 08:36
quelle
8

Mit awk:

%Vor%

Erklärung

  1. Die Bedingung beginnt mit einem ! ( Negation ), das negiert das folgende Muster;
    • /^P/ bedeutet "Übereinstimmung mit allen Zeilen, beginnend mit einer Groß- / Kleinschreibung P " ,
  2. Also wird das Muster zu " ignorieren Zeilen, die mit einem Groß- / Kleinbuchstaben P " .
  3. beginnen, negiert
  4. Schließlich wird das Verhalten von awk genutzt, wenn { … } ( Aktionsblock ) fehlt, dh um den Datensatz auszudrucken, der die Bedingung validiert.

Um es also anders auszudrücken, ignoriert es Zeilen, die mit einem capital P beginnen, und druckt alles andere .

Hinweis

sed ist zeilenorientiert und awk spaltenorientiert. Für Ihren Fall sollten Sie den ersten verwenden, siehe Edouard Lopez 'Antwort.

    
Zulu 20.06.2013 10:09
quelle
2

Das funktioniert:

%Vor%

-e gibt Ausdruck an.

    
Prasanth 20.06.2013 08:42
quelle
2

Verwenden Sie den Anfang der Zeilenmarkierung und der Anführungszeichen:

%Vor%

P* bedeutet P null oder mehrmals, also zusammen mit -v gibt es keine Zeilen

^P.* bedeutet Anfang der Zeile, dann P und jedes Zeichen null oder mehr Male

Zitieren ist erforderlich, um die Shell-Erweiterung zu verhindern.

Dies kann zu

verkürzt werden %Vor%

weil .* nicht benötigt wird, daher wird keine Angabe benötigt und egrep kann Daten aus der Datei lesen.

Da wir keine erweiterten regulären Ausdrücke verwenden, funktioniert grep auch gut

%Vor%

Endlich

%Vor%     
Grzegorz Żur 20.06.2013 08:36
quelle
1

Verwenden Sie sed mit Inplace-Substitution (für GNU sed, wird auch für Ihre Cygwin)

%Vor%

BSD (Mac) sed

%Vor%     
bartimar 20.06.2013 09:05
quelle

Tags und Links