Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren? Al
Am Dienstag, 24. Juni 2003 18:18 schrieb Al Bogner:
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
Nun, es sollte mit folgendem funktionieren: grep -v ^# /foo/bar | grep -v ^$
Al Gruß Joachim
Al Bogner
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
grep -v "^#" file ok da muß # am Zeilenanfang stehen, aber da kann man ja beliebig basteln (Stichwort: reguläre Ausdrücke) Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 juergen.vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
Hallo, On Tue, 24 Jun 2003, Al Bogner schrieb:
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
==== ~/bin/delcomments ==== #!/usr/bin/sed -f s/^[ \t]*#.*// /^[ \t]*$/d ==== -dnh -- The speed at which a mistyped command executes is directly proportional to the amount of damage done. -- Joe Zeff
Am Dienstag, 24. Juni 2003 19:40 schrieb David Haller:
Hallo,
On Tue, 24 Jun 2003, Al Bogner schrieb:
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
==== ~/bin/delcomments ==== #!/usr/bin/sed -f s/^[ \t]*#.*// /^[ \t]*$/d ====
-dnh
-- The speed at which a mistyped command executes is directly proportional to the amount of damage done. -- Joe Zeff
Hallo David, koenntest Du bitte ein par Saetze zu diesem sed konstrukt schreiben, ich blick nicht ganz wie es funktioniert (aber es tut ;-) Annsonsten haette ich noch einen vorschlag: egrep '^#|^$' /foo/bar >> /bar/foo regards Martin -- ________________________________creating IT solutions Martin Schmiderer science + computing ag System Administration Hagellocher Weg 71-75 phone +49 7071 9457 225 72070 Tuebingen, Germany fax +49 7071 9457 211 www.science-computing.de
* Martin Schmiderer schrieb am 25.Jun.2003:
Am Dienstag, 24. Juni 2003 19:40 schrieb David Haller:
Hallo,
On Tue, 24 Jun 2003, Al Bogner schrieb:
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
==== ~/bin/delcomments ==== #!/usr/bin/sed -f
Hierdurch wird sed als Interpreter aufgerufen.
s/^[ \t]*#.*//
s steht für erstzen. Und zwar wird alles was auf ^[ \t]*#.* paßt durch nichts ersetzt. Das ^ steht für den Anfang der Zeile, daß heißt, es wird nur ersetzt, wenn [ \t]*#.* am Anfang der Zeile steht. [ \t] steht für eins der Zeichen " " also blank und \t also TAB. Ich bin mir aber nicht sicher, ob das funktioniert. Ich meine innerhalb der [ ] steht jedes Zeichen für sich selber und schriebe stattdessen: [ ] also ein Blank und ein Tab innerhalb der Klammer. Das * besagt, daß das Zeichen davor, hier also [ \t] beliebig oft vorkommen kann, unter beliebig ist auch gar nicht zu verstehen. Danach steht das # für sich selber, der . für jedes beliebige Zeichen und das * wieder für beliebig oft. Insgesamt wird hier eine Zeichenkette, die aus beliebig viele Leerzeichen, bzw. Tabulatoren am Zeilenanfang gefolgt von einem # und dann noch beliebig viele beliebige Zeichen durch nichts ersetzt, also gelöscht.
/^[ \t]*$/d
Hier steht ^ wieder für den Zeilenanfang, [ \t] für ein Leerzeichen oder einen TAB und * für beliebig viele wiederholungen des Zeichens zuvor. Das $ steht für das Zeilenende. Das d hinter dem Muster ist wieder ein sedBefehl, der besagt daß die Zeile gelöscht wird. Insgesammt heißt das, daß Leerzeilen gelöscht werden. Die Leerzeilen können auch Leerzeichen oder Tabulatoren, aber nichts anderes beinhalten.
koenntest Du bitte ein par Saetze zu diesem sed konstrukt schreiben, ich blick nicht ganz wie es funktioniert (aber es tut ;-)
Annsonsten haette ich noch einen vorschlag:
egrep '^#|^$' /foo/bar >> /bar/foo
Hiermit werden Zeilen, die ein # am Anfang haben, oder auch Leerzeilen ausgegeben. Ist wohl genau das Gegenteil, von dem was Du willst, oder? Da müßte noch ein -v als Option dazu. Hierbei darf aber auch kein Leerzeichen vor dem # stehen und die Leerzeilen müssen wirklich ganz leer sein. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
Am Mittwoch, 25. Juni 2003 14:35 schrieb Bernd Brodesser:
* Martin Schmiderer schrieb am 25.Jun.2003:
egrep '^#|^$' /foo/bar >> /bar/foo
Hiermit werden Zeilen, die ein # am Anfang haben, oder auch Leerzeilen ausgegeben. Ist wohl genau das Gegenteil, von dem was Du willst, oder? Da müßte noch ein -v als Option dazu. Hierbei darf aber auch kein Leerzeichen vor dem # stehen und die Leerzeilen müssen wirklich ganz leer sein.
Bernd
Hallo Bernd, erstmal danke fuer die gute Erklaerung, ich sollte mal wieder etwas laenger schlafen :-) Jetzt wo ich das gelesen habe faellts mir wie schuppen von den Augen. Und ganz klar, das -v muss hin (ist wohl beim abschreiben untergegangen (warum habe ich das eigentlich nicht abgemaust???)). Na da mach ich mal fuer heute besser Feierabend :-) Aber so gehts auch (und das ist getestet): egrep -v '^[ \t]*#.*|^[ \t]*$' kdmrc >> kdm.NEW regards Martin -- ________________________________creating IT solutions Martin Schmiderer science + computing ag System Administration Hagellocher Weg 71-75 phone +49 7071 9457 225 72070 Tuebingen, Germany fax +49 7071 9457 211 www.science-computing.de
*** Martin Schmiderer (m.schmiderer@science-computing.de) schrieb heute in...:
[...] koenntest Du bitte ein par Saetze zu diesem sed konstrukt schreiben, ich blick nicht ganz wie es funktioniert (aber es tut ;-)
Das erste pattern ersetzt Zeilen, die mit "[[:space:]]#" anfangen durch "nichts", das zweite Pattern löscht Zeilen, in denen nichts steht... was latürlich mehr löschen kann, als gewünscht. Sinniger sollte also wohl sein sed -e "/^[ \t]*#/d" < <Quelldatei> > <Zieldatei> Soll ich mich bei euch bewerben!?... MG Henning Hucke -- Ich koche lieber selber, als bei MC Donalds zu essen, aber wem das Kaffeewasser anbrennt, der geht doch lieber zu diese große amerikanische Kette. Selberkochen ist nur dann zu empfehlen, wenn es Spaß macht. Mit Linux ist es genauso. -- Bernd Brodesser auf suse-linux@suse.de
Hallo, On Wed, 25 Jun 2003, Martin Schmiderer schrieb:
Am Dienstag, 24. Juni 2003 19:40 schrieb David Haller:
On Tue, 24 Jun 2003, Al Bogner schrieb:
Welche Möglichkeiten gibt es Kommentare (#) von Dateien nicht anzuzeigen? Kann man das mit grep filtern? Gibt es eventuell auch mit vi eine Möglichkeit beim Editieren?
==== ~/bin/delcomments ==== #!/usr/bin/sed -f s/^[ \t]*#.*// /^[ \t]*$/d ====
Apropos, wie schon angemerkt expandiert sed die '\t' in den [] nicht. Ich habe das script leider bisher immer nur so verwendet, dass das noch nicht auffiel. Denke dir dort jetzt kurz mal ein echtes Tab statt dem '\t'. Dann wuerde das folgendes machen: 1. Falls in einer Zeile nur Leerzeichen/Tabs vor einem '#' vorkommen, ersetze die gesamte Zeile durch nichts. 2. Loesche alle Zeilen, die nur Leerzeichen oder nichts enthalten (also u.a. auch die, die durch Schritt 1 entstanden sind). Aber wie ich jetzt auch merke, ist das s/// eigentlich ueberfluessig. Besser ist daher wohl folgendes: ==== ~/bin/delcomments ==== #! /usr/bin/sed -f /^[[:space:]]*#/d /^[[:space:]]*$/d ==== Der erste Befehl loescht Zeilen, die vor einem '#' nur bel. viel "Whitespace" enthalten, der zweite loescht Zeilen, die nur "Whitespace" enthalten oder leer sind. Lass also ggfs. die zweite Zeile weg, falls dies nicht erwuenscht ist. Falls dein 'sed' keine Zeichenklassen kann, muss man eben die "normale" Variante '[<leerzeichen><tab>]' verwenden. Das ganze geht natuerlich auch "per Hand" auf der Kommandozeile: sed -e '/^[[:space:]]*#/d' -e '/^[[:space:]]*$/d' Aber das finde ich unpraktischer als ein "gcc -E | delcomments" ;) Achso, 'chmod u+x ~/bin/delcomments' nicht vergessen ;)
Annsonsten haette ich noch einen vorschlag:
egrep '^#|^$' /foo/bar >> /bar/foo
Ja, wenn du egrep -v verwendest ist das fast aequivalent... Aequivalent waere: egrep -v '^[[:space:]]*#|^[[:space:]]*$' (egrep ist nicht noetig, man muss nur das '|' durch '\|' ersetzen ;) Ich finde eben die Variante mit dem ausfuehrbaren sed-script praktischer (und flexibler). -dnh --
s/he/she/it I think alt.peeves determined that the correct term to use here is "s/h/it". If you want, but doesn't titat make messages itard to read? -- Chris Rovers, Dave Brown and Peter da Silva
participants (7)
-
Al Bogner
-
B.Brodesser@t-online.de
-
David Haller
-
Henning Hucke
-
Joachim Karnbach-Mink
-
Jürgen Vollmer
-
Martin Schmiderer