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

182

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 die Zeile enthalten #, jedoch nicht am Zeilenanfang, sollten ignoriert werden.

Dorf
quelle
1
Muss es mit der allgemeinen Konvention funktionieren, die #blah \<nl>blahals einzelne "logische Zeile" gilt, da der Backslash der neuen Zeile entgeht?
Sarnold
@sarnold: Abgesehen davon make, welche Dienstprogramme verwenden die 'Backslash-Spleißlinien vor dem Beenden eines Kommentars'? Die Shells (Bash und Ksh getestet) tun dies nicht. C und C ++ behandeln das Spleißen von Zeilenumbrüchen vor der anderen Verarbeitung von Präprozessoranweisungen, aber es handelt sich eher um Anweisungen als um Kommentare.
Jonathan Leffler
@ Jonathan: Super. Ich hatte angenommen, dass die gemeinsame \<nl>Flucht auch bei Kommentaren funktionieren würde. Aber wow, ich habe mich geirrt. Ich konnte noch kein anderes Beispiel finden ... :) Danke!
Sarnold

Antworten:

301

Dies kann mit einem sed Einzeiler erfolgen :

sed '/^#/d'

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

Raymond Hettinger
quelle
9
kürzere Version:sed /^#/d
Kev
80
Für Linux Noobs wie mich:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan
49
Kürzeste Version : sed -i '/^#/d' filepath.
Lesderid
14
Und sed -i '' '/^#/d' filepathauf dem Mac ( weil das Suffix -i obligatorisch ist )
Paulcm
1
@Viesturs Versuchen Sie dies: awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger
56

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

grep -v '^#' filename

Dies löst das Problem wie angegeben.

Beachten Sie jedoch, dass eine gemeinsame Konvention darin besteht, dass alles von a #bis zum Ende einer Zeile als Kommentar behandelt wird:

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

Dies behandelt beispielsweise ein #Zeichen in einem Zeichenfolgenliteral als den Beginn eines Kommentars (der für Ihren Fall relevant sein kann oder nicht) (und es bleiben leere Zeilen).

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

grep -v '^ *#' filename

wenn Leerzeichen nur Leerzeichen sind, oder

grep -v '^[  ]#' filename

Dabei sind die beiden Leerzeichen tatsächlich ein Leerzeichen, gefolgt von einem wörtlichen Tabulatorzeichen (Typ "control-v tab").

Lassen Sie für alle diese Befehle das filenameArgument weg, das aus der Standardeingabe gelesen werden soll (z. B. als Teil einer Pipe).

Keith Thompson
quelle
Ich habe eine neue Antwort hinzugefügt , die auf dieser Antwort aufbaut.
Acumenus
Ich hatte Probleme, grep auf diese Weise unter Windows zu verwenden. Die Lösung besteht darin, 'durch' zu ersetzen, z. B.grep -v "^#" filename
Serg
14

Das Gegenteil von Raymonds Lösung:

sed -n '/^#/!p'

"Drucken Sie nichts aus, außer Zeilen, die NICHT mit # beginnen."

an einer
quelle
8

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 sedsollten Sie keine Zeilen löschen, die mit beginnen #!. Außerdem sollten Zeilen gelöscht werden, die nur einen Hash, aber keinen Text enthalten. Alles zusammen:

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

Um mit allen sed-Varianten konform zu sein, müssen Sie der -iOption eine Backup-Erweiterung hinzufügen :

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak
rubo77
quelle
plus 1 für den, der Raum
deepaksingh pawar
7

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

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

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

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

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

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

Scharfsinn
quelle
Angenommen, Sie egrepunterstützen diese Syntax. ältere Versionen möglicherweise nicht.
Keith Thompson
-3

Hier ist es mit einer Schleife für alle Dateien mit einer Erweiterung:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
Bruno Damas
quelle