it-swarm.com.de

Löschen Sie alle Zeilen, die mit einem # beginnen, aus einer Datei

Alle Zeilen mit Kommentaren in einer Datei beginnen mit #. Wie kann ich alle Zeilen (und nur die Zeilen) löschen, die mit # Beginnen? Andere Zeilen, die # Enthalten, aber nicht am Zeilenanfang stehen, sollten ignoriert werden.

153
Village

Dies kann mit einem sed one-liner gemacht werden:

sed '/^#/ d'

Hier heißt es: "Finde alle Zeilen, die mit # beginnen, und lösche sie, wobei alles andere übrig bleibt."

256

Ich bin ein wenig überrascht, dass niemand die naheliegendste Lösung vorgeschlagen hat:

grep -v '^#' filename

Dies löst das Problem wie angegeben.

Aber beachten Sie, dass eine gemeinsame Konvention für alles von einem # bis zum Ende einer Zeile, die als Kommentar behandelt werden soll:

sed 's/#.*$//' filename

obwohl das behandelt, zum Beispiel, ein # Zeichen in einem String-Literal als Beginn eines Kommentars (der für Ihren Fall relevant sein kann oder nicht) (und leere Zeilen hinterlässt).

Eine Zeile, die mit einem beliebigen Leerzeichen beginnt, gefolgt von # könnte auch als Kommentar behandelt werden:

grep -v '^ *#' filename

wenn Leerzeichen nur Leerzeichen sind, oder

grep -v '^[  ]#' filename

wobei die beiden Leerzeichen tatsächlich ein Leerzeichen sind, gefolgt von einem literalen Tabulatorzeichen (geben Sie "control-v tab" ein).

Lassen Sie für alle diese Befehle das Argument filename weg, um es aus der Standardeingabe zu lesen (z. B. als Teil einer Pipe).

51
Keith Thompson

Das Gegenteil von Raymonds Lösung:

sed -n '/^#/!p'

msgstr "gib nichts aus, außer Zeilen, die NICHT mit # beginnen"

13
ata

Für eine awk-Lösung können Sie Folgendes verwenden:

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
7
jaypal singh

sie können Ihre Datei direkt mit bearbeiten

sed -i '/^#/ d'

Wenn Sie auch Kommentarzeilen löschen möchten, die mit einem Leerzeichen beginnen, verwenden Sie

sed -i '/^\s*#/ d'

Normalerweise möchten Sie die erste Zeile Ihres Skripts beibehalten, wenn es sich um einen Sha-Bang handelt. Daher sollte sed keine Zeilen löschen, die mit #! Beginnen. es sollte auch Zeilen löschen, die nur einen Hash, aber keinen Text enthalten. Füge alles zusammen:

sed -i '/^\s*\(#[^!].*\|#$\)/d'
5
rubo77

Diese Antwort baut auf dem früheren Antwort von Keith auf.

egrep -v "^[[:blank:]]*#" Sollte Kommentarzeilen herausfiltern.

egrep -v "^[[:blank:]]*(#|$)" sollte sowohl Kommentare als auch leere Zeilen herausfiltern, wie dies häufig nützlich ist.

Informationen zu [:blank:] Und anderen Zeichenklassen finden Sie unter https://en.wikipedia.org/wiki/Regular_expression#Character_classes .

5
Acumenus