Bash - entfernen Sie alle Zeilen beginnend mit 'P'
Ich habe eine text-Datei, die ist über 300 KB groß. Ich möchte entfernen Sie alle Zeilen aus dieser Datei, die mit dem Buchstaben beginnen "P". Dies ist, was ich benutzt habe:
> cat file.txt | egrep -v P*
Ist das nicht die Ausgabe auf die Konsole. Kann ich über ein cat auf die Datei ohne andere Befehle und es druckt gut. Meine Letzte Absicht sein, die:
> cat file.txt | egrep -v P* > new.txt
Kein Fehler angezeigt, es funktioniert einfach nicht drucken alles aus und wenn ich den 2. Befehl, new.txt ist leer.
Ich sollte sagen, ich bin mit Windows 7 mit Cygwin installiert.
- Warum brauchen Sie
egrep
? IstP
eine erweiterte regex? - qnd: Regex ist falsch.
P*
sagt "Platzhalter für eine beliebige Anzahl (auch 0) vonP
" so entspricht jede einzelne Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklärung
^
zu verankern Sie Ihr Muster an den Anfang der Zeile,sed
und die- d
- flag.Lösung #1
Bessere Lösung
Verwenden
sed
-nur:Mit awk:
Erklärung
!
(negation), dass negiert folgendem Muster ;/^P/
bedeutet "match alle Zeilen mit einem Großbuchstaben beginnendP
",P
".awk
's Verhalten, wenn{ … }
(Aktion block) fehlt, ist der Druck der record-überprüfung der Bedingung.So, umformulieren, es ignoriert Zeilen mit einem Großbuchstaben beginnend
P
- und print-alles andere.Hinweis
sed
ist zeilenorientiert undawk
Spalte orientiert. Für Ihren Fall sollten Sie zuerst verwenden, siehe Edouard Lopez ' s Antwort.Dies funktioniert:
-e
gibt an Ausdruck.Verwenden, starten Sie von Zeile zu markieren und Zitate:
P*
bedeutet, P null oder mehrere Male, so dass zusammen mit-v
gibt Sie keine Linien^P.*
bedeutet Zeilenanfang, dann P, und jeder char null oder mehrere MaleZitieren ist notwendig, um zu verhindern, dass die shell-Erweiterung.
Diese kann verkürzt werden, um
weil
.*
ist nicht erforderlich, daher zitieren ist nicht nötig undegrep
Lesen von Daten aus einer Datei.Da wir nicht nutzen Sie die erweiterte reguläre Ausdrücke
grep
wird auch funktionierenSchließlich
cat file | egrep ...
, das ist besser:egrep .... file
..*
ist überflüssig, so gut. Tropfen, und Sie brauchen noch nicht einmal zu zitieren. Verwenden Sie einfachgrep -v ^P "${old_file}" > "${new_file}"
.Verwenden
sed
mit in-Place-Ersetzung (fuer GNU sed, auch für Ihre cygwin)BSD (Mac) sed
sed -i .bak -e '/^P/d' file.txt
um eine Sicherungskopie zu erstellensed '/^P/d' file.txt > file.txt
was noch schlimmer ist :))