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.
182
#blah \<nl>blah
als einzelne "logische Zeile" gilt, da der Backslash der neuen Zeile entgeht?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.\<nl>
Flucht auch bei Kommentaren funktionieren würde. Aber wow, ich habe mich geirrt. Ich konnte noch kein anderes Beispiel finden ... :) Danke!Antworten:
Dies kann mit einem sed Einzeiler erfolgen :
Darin heißt es: "Finde alle Zeilen, die mit # beginnen, und lösche sie, wobei alles andere übrig bleibt."
quelle
sed /^#/d
sed '/^#/ d' < inputFile.txt > outputFile.txt
sed -i '/^#/d' filepath
.sed -i '' '/^#/d' filepath
auf dem Mac ( weil das Suffix -i obligatorisch ist )awk '/^#/ && !first { first=1 ; next } { print $0}'
Ich bin ein wenig überrascht, dass niemand die naheliegendste Lösung vorgeschlagen hat:
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: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:wenn Leerzeichen nur Leerzeichen sind, oder
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
filename
Argument weg, das aus der Standardeingabe gelesen werden soll (z. B. als Teil einer Pipe).quelle
grep -v "^#" filename
Das Gegenteil von Raymonds Lösung:
"Drucken Sie nichts aus, außer Zeilen, die NICHT mit # beginnen."
quelle
Sie können Ihre Datei direkt mit bearbeiten
Wenn Sie auch Kommentarzeilen löschen möchten, die mit einem Leerzeichen beginnen, verwenden Sie
Normalerweise möchten Sie die erste Zeile Ihres Skripts beibehalten, wenn es sich um einen Sha-Bang handelt. Daher
sed
sollten 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:Um mit allen sed-Varianten konform zu sein, müssen Sie der
-i
Option eine Backup-Erweiterung hinzufügen :quelle
Sie können Folgendes für eine awk-Lösung verwenden:
quelle
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 .quelle
egrep
unterstützen diese Syntax. ältere Versionen möglicherweise nicht.Hier ist es mit einer Schleife für alle Dateien mit einer Erweiterung:
quelle