Wie kann ich eine Datei "cat" und kommentierte Zeilen entfernen?


29

Ich würde gerne wissen, ob es einen Weg gibt, wie ich alle Zeilen, die mit beginnen, catablegen php.iniund entfernen kann;

Wenn die Datei beispielsweise Folgendes enthält:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

und ich habe den richtigen Befehl ausgeführt cat | {remove comments command}, dann würde ich am Ende mit:

error_reporting  =  E_ALL & ~E_NOTICE

Hinweis - ich davon aus, dass catwäre der beste Weg, dies zu tun , aber ich bin wirklich gut mit der Antwort unter Verwendung eines anderen Dienstprogramm wie awk, sed, egrepusw.


Was ist mit so etwas error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Sollte der Kommentar auch in diesem Fall entfernt werden?
ein Lebenslauf vom

@ MichaelKjörling - Mir geht es wirklich gut mit Zeilen, die mit dem Entfernen von Kommentaren beginnen
cwd

1
catist das Tool zum Verketten von Dateien. grepist das Werkzeug, um Linien anhand von Mustern zu filtern. sedund awkkann auch diese Zeilen ändern.
Stéphane Chazelas

Antworten:



25

Sie müssen eine Datei nicht durch grep leiten, grep verwendet Dateinamen als Befehlszeilenargumente.

grep -v '^#' file1 file2 file3

druckt alle Zeilen mit Ausnahme derjenigen, die mit einem # Zeichen beginnen. Sie können das Kommentarzeichen beliebig ändern.

Wenn Sie mehr als ein Kommentarzeichen haben (vorausgesetzt, es steht am Anfang einer Zeile)

egrep -v '^(;|#|//)' filelist

2
Eine andere, die ich gemacht habe und die immer bei mir blieb, war grep '^[^;]' filename. Ich kann jedoch nicht mit seiner Portabilität sprechen!
Jodie C

@JodieC, das ist portabel, entfernt aber auch Leerzeilen (was oft gewünscht wird). Das Standardäquivalent von egrepist grep -E. Man kann auchgrep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egrepkönnen Sie die Verwendung von sparen cat. Mit anderen Worten, erstellen Sie weniger Prozesse ( egrepvs cat+ egrep) und verwenden Sie weniger Puffer (Pipe von catbis egrepvs keine Pipe).

Es ist im Allgemeinen eine gute Idee, die Verwendung von cateinzuschränken, wenn Sie einfach eine Datei an einen Befehl übergeben möchten, der sie selbst lesen kann.

Mit diesem Befehl werden Kommentare entfernt, auch wenn sie mit Leerzeichen oder Tabulatoren eingerückt sind:

egrep -v '^ [[: blank:]] *;' file.ini

Es ist lustig, dass Sie das neuere Regex-Format für [[ Zeichenklassen ]] mit dem egrepBefehl kombinieren, der seit mindestens einem Jahrzehnt veraltet ist.
mikeserv

Interessant ... aktuelle Dokumente unter gnu.org/software/grep/manual/html_node/… enthalten POSIX-Klassen.
Jack Wasey

7
egrep -v '^;|^$' $file

das schließt Zeilen aus, die mit dem ';' beginnen, und leere Zeilen.

Gibt in Regex ^den Anfang einer Zeile und $das Ende einer Zeile an, ^$gibt also Zeilen an, bei denen das Zeilenanfangszeichen und das Zeilenendezeichen direkt nebeneinander stehen.


Wenn ich das richtig lese, kann dies kommentierte Zeilen, aber auch leere Zeilen entfernen.
KWD

1
@cwd Ja. Ich bin mir nicht sicher, warum er beide eingeschlossen hat, aber wenn Sie nur kommentierte Zeilen entfernen möchten, verwenden Sie einfachegrep -v '^;'
Michael Mrozek

4
egrep mag auch Dateien (weniger Prozesse und Puffer verwendet), und ein kleiner Bonus wäre, eingerückte Kommentare zu entfernen:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
Wir brauchen ein "nutzloses Katzenabzeichen".
Simon Richter

@nrolans - sieht aus wie ein beliebter Kommentar. Warum nicht eine Antwort?
KWD

2

Ein einfacher awkEinzeiler awk '/^;/{next}1' input_filesollte den Trick machen.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
Richtig, aber wortreich. Einfach awk '!/^;/' input_fileist genug.
Handarbeit

2

Sowie Jaypal würde ich höchstwahrscheinlich auch awkfür diese Zwecke verwenden. Es ist schlimmer zu erwähnen, dass Perl manchmal für solche Zwecke recht praktisch ist:

cat data.txt | perl -lne "print unless /^;/"

Perl-Regexps sind leistungsstärker als die von awk, und manchmal benötigen Sie sie.


+1 für Perl, obwohl die Katze und die -l beide redundant sind, so ist ein einfacherer Aufrufperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@ Simone Whitaker, ja, Sie haben Recht - es ist nur eine Gewohnheit, es so zu schreiben, wie ich es schreibe, und es lohnt sich, es zu erwähnen.
Shabunc

1
Sichere Sache. In der Tat, ich denke, catfunktioniert in diesen Beispielen gut, wenn Sie es als Proxy für die allgemeineren "alles, was Text auf STDOUT generiert" betrachten. Unix-Pfeifen sind das Beste seit geschnittenem Brot, imho. :)
Simon Whitaker

2

Bei dieser Ausarbeitung der Antwort von @ shabunc wird Perl verwendet, um Kommentare (einschließlich Inline-Kommentare) zu entfernen und dann alle Zeilen zu drucken, die etwas anderes als Leerzeichen enthalten.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Erläuterung:

  • s/;.*//Verwendet den Substitutionsoperator ( s/<regex>/<replacement>/), um Instanzen eines Semikols und alles, was darauf folgt, in einer Zeile durch die leere Zeichenfolge zu ersetzen.
  • print if /\S/Gibt die Zeile aus, wenn sie mit dem regulären Ausdruck übereinstimmt. Hierbei \Shandelt es sich um eine Zeichenklasse, die mit allen Nicht-Leerzeichen übereinstimmt.

1

Hier ist eine, die ich benutze, nur ';' mit dem Kommentarzeichen (z. B. '#' für viele UNIX-Dienstkonfigurationsdateien):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Dadurch werden alle Ganzzeilenkommentare (auch wenn sie führende Leerzeichen enthalten) sowie alle Kommentare, die auf Nichtkommentarzeilen enden, entfernt und auch Leerzeilen werden in Kürze aus der Ausgabe entfernt. Dies mag ohne die Pipeline möglich sein (mein Sed- oder Awk-Fu ist zugegebenermaßen nicht großartig), aber es ist so leicht für mich zu verstehen (und mich zu erinnern), dass ich dachte, ich würde es hier posten.


1

Beispiel zeige nur Zeilen + zeige keine neuen Zeilen oder leeren Zeilen:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

ODER

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
Die Verwendung von egrepist längst veraltet. grep -Eist der Befehl, den Sie hier suchen.
mikeserv

0
egrep -v ^'(#|$)' file.txt

Entfernt alle Kommentare und Leerzeilen aus der Datei file.txt


2
Sie sollten erwägen, Ihre Antwort mit ein wenig mehr Informationen für die Uneingeweihten zu erweitern (z. B. genau das, was der Regex, den Sie verwenden, tut).
HalosGhost

egrepwird abgeschrieben. Verwenden Sie grep -Evstattdessen.
Yokai


0

Mit dem folgenden Befehl können Sie die Zeilen mit Ausnahme von Leerzeilen und Zeilen, die mit # beginnen, in einer neuen Datei speichern

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


Nutzlose catPfeife und egrepwird abgeschrieben und grep -Efür erweiterte Ausdrücke oder nur ersetzt grep -v.
Yokai
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.