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.


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."


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).


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."


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

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

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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.