2016-08-27 4 views
0

Ich habe eine Datei, die mehrere Zeilen hat.Bash-Skript löschen Sie eine Zeile in der Datei

Zum Beispiel:

a 
ab# 
ad. 
a12fs 
b 
c 
... 

I sed oder awk löschen Sie die Zeile verwenden möchten, wenn die Linie Symbole oder Zahlen enthalten. (Ich möchte zum Beispiel löschen: ab #, ad., A12fs .... Zeilen) oder mit anderen Worten, ich möchte nur die Zeile behalten, die [a-z] [A-Z] enthält.

Ich weiß, wie Anzahl Zeile zu löschen,

sed '/[0-9]/d' file.txt 

aber ich weiß nicht, wie Symbole Linien zu löschen.

Oder gibt es eine einfache Möglichkeit, das zu tun?

Antwort

1

grep funktioniert auch gut und ist noch einfacher: genau das Gegenteil tun: die Linien halten, die Sie interessieren, die Art und Weise leichter

grep -i '^[a-z]*$' file.txt 

(Einstimmungsleitungen nur Buchstaben zu definieren und Leerzeilen enthält, und -i Option macht grep Groß- und Kleinschreibung)

leere Linien zu entfernen, auch:

grep -i '^[a-z]+$' file.txt 

Vorsicht, wenn Windows-Textdateien verwenden, wie gibt es einen Wagenrücklauf am Ende der Leitung, so auf grep Versionen je nichts würde passen (hier getestet an Fenstern und es funktioniert)

aber nur für den Fall:

grep -iP '^[a-z]*\r?$' 

(beachten Sie die P-Option perl-Ausdrücke aktivieren oder \r nicht erkannt wird)

1

du sed verwenden können:

sed '/^[A-Za-z0-9]\+$/!d' file 

(OR)

sed '/[^A-Za-z0-9]/d' file 
2

Leerzeilen bleiben:

grep '^[[:alpha:]]*$' file 
sed '/[^[:alpha:]]/d' file 
awk '/^[[:alpha:]]*$/' file 

Leerzeilen zu entfernen:

grep '^[[:alpha:]]+$' file 
sed -E -n '/^[[:alpha:]]+$/p' file 
awk '/^[[:alpha:]]+$/' file 
1
$ awk '!/[^[:alpha:]]/' file.txt 
a 
b 
c 
+0

'/ [^ [: alpha:]]! /' Bedeutet „** NOT ** enthält Zeichen, die ** NICHT ** alphabetisch sind ", was ein doppeltes Negativ ist und daher möglichst vermieden werden sollte. –

+1

@Ed Morton, ich sehe in deiner Antwort, wie du eine "awk" Lösung im Vergleich zu dieser gehandhabt hast und deine Methode macht sicherlich Sinn. Wie kann diese Lösung jedoch problematisch sein, oder könnten Sie mich in eine Richtung lenken, in der ich lesen könnte, warum ich die Verwendung eines doppelten Negativs vermeiden sollte? Vielen Dank. – user3439894

+1

Doppelte Negative sind nur schwer zu verstehen, sei es in einer Programmiersprache oder in gesprochener Sprache, und das Negativ eines Negativs ist positiv (- (- 1) = 1). Wenn Sie also mit einem Schreibcode konfrontiert werden, sollten Sie sich die Zeit nehmen um herauszufinden, was die positive Bedingung ist und schreiben Sie das stattdessen. Um das zu erweitern - niemals Variablen negativ schreiben (z.'databaseNotAvailable'), denn dann ist es fast garantiert, dass Sie irgendwo doppelte Negative schreiben müssen (z. B.'! databaseNotAvailable'). Vergleichen Sie mit '! DatabaseIsAvailable' und' databaseIsAvailable'. Entschuldigung, ich kenne keine gute Referenz. –

Verwandte Themen