Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

csh Skript um Kommentar in *.h Files anzupassen

d-oli / 11 Antworten / Baumansicht Nickles

Hi,

Ich möchte mit einem csh - Skript in C++ *.h - Files dem Kommentar vor jeder Klassendeklaration folgendes hinzufügen:

! \\class

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
d-oli Nachtrag zu: „csh Skript um Kommentar in *.h Files anzupassen“
Optionen

Irgenwie fehlt da was ... noch ein Versuch


Hi,

Ich moechte mit einem csh - Skript in C++ *.h - Files dem Kommentar vor jeder Klassendeklaration folgendes hinzufügen:

! \class <name>

Ein Beispiel:

/* <hier soll "! \class class0" rein>
** Class: class0
**
** Der Kommentar ...
**
*/
class class0
{
public:

protected:

private:
};

Ich habe rausgefunden, wie ich in *.h - Files "** Class:" finden und auf der Konsole den Pfad ausgeben kann:

#!/bin/csh -f
again:
find . -name "*.h" -exec grep -l "** Class:" {} \;
shift
goto again

Das Resultat ist:

$ ./addcd
./class0/class0.h
shift: No more words.

Kennt sich jemand damit aus? Wie kann ich jetzt eine Zeile zürückgehen und etwas einfügen? Oder kann ich nach "/*\n** Class:" suchen und durch "/*! \class <name>\n** Class:" ersetzen?

Dank und Gruss, d-oli

PS: Das ganze dient dazu, um mit doxygen schöne Klassendiagramme zu erstellen.


Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
d-oli Nachtrag zu: „Irgenwie fehlt da was ... noch ein Versuch Hi, Ich moechte mit einem csh -...“
Optionen








Ein regulaerer Ausdruck mit "new line" scheint nicht zu funktionieren. Es sieht so aus, als ob sed sich die letzte Zeile merkt und dann dort mit dem Einfuegen beginnt.

Bsp. ohne \\n:
*************

$ sed 's#** Class:#**! Class:#' theclass.h
/*
**! Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Bsp. mit \\n:
************

$ sed 's#/*\\n** Class:#/*!\n** Class:#' theclass.h
/*
**/*!
** Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Und wieso wird "/*!" nach "**" eingefuegt und nicht vorher?
Hat es was mit '\\n' oder gar mit '!' zu tun?

Noch ein Beispiel mit '!' nach '\\n':
************************************
$sed 's#/*\n** Class:#/*\\n!** Class:#' theclass.h
sed 's#/*\n** Class:#/*\\n Class:#' theclass.h
/*
**/*
Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Das passierte nach einer Fehleingabe ('!' nach '\\n'). Sieht fuer mich so aus als ob '!' ein Steuerzeichen ist.

Tipps?

Dank und Gruss, d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
vergisses d-oli „csh Skript um Kommentar in *.h Files anzupassen“
Optionen

Hallo,

der find Syntax ist
find -name -exec {} \\;

also
find . -name "*.h" -exec grep -l "\\*.Class:" {} \\;

Allerdings ist ein Shell Script nicht unbedingt das optimale
Tool für Deine Aufgabenstellung.
Ich würde es mal mit dem Stream Editor sed oder mit awk versuchen.

Gruss, vergisses.

bei Antwort benachrichtigen
d-oli vergisses „Hallo, der find Syntax ist find -name -exec also find . -name .h -exec grep -l...“
Optionen

Hi,
sed, awk? Ich hab mir die man pages und einige tutorials per google angeschaut ... uff!! Ist nicht wirklich viel besser als shel script, oder nicht? Ich glaube ich versuche mich mal mit Perl.

Was denkst Du?

Dank und Gruss, d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
vergisses d-oli „Hi, sed, awk? Ich hab mir die man pages und einige tutorials per google...“
Optionen

Hi d-oli,

zugegeben, zuerst sieht die Sache sehr kompliziert aus,
aber wenn man sich mal etwas näher mit sed und awk beschäftigt,
ist es gar nicht so wild.
Das Hauptproblem sind wie so oft die Regular Expressions....

Man sollte einfach ganz pragmatisch das Werkzeug wählen,
was zur Aufgabenstellung am Besten passt.

Tools wie grep, cut, paste, sort usw. sind geeignet,
Informationen aus Textdateien zu extrahieren, sortieren
und in neuer Form wieder zusammen zu fügen.

Mit shell Scripten kann man Abläufe automatisieren.
Das schließt auch das Einbetten von Tools
wie sed, awk, grep usw. in Abläufe ein.

Zur Veränderung von Textinhalten sollte man Editoren nehmen.

Bei einer Batchverarbeitung, wie sie in shell Scripten
ja üblich ist, kann man aber keinen interaktiven Editor
nehmen, sondern muß einen programmierbaren Editor verwenden.

Der awk ist eine Scriptsprache zur Verarbeitung von Texten,
die am Besten in Tabellenform aufgebaut sind und für Deine
Aufgabenstellung weniger geeignet.

Der StreamEDitor sed ist im Kern nicht Anderes als der vi,
mit dem Unterschied, dass die Eingaben nicht von der Tastatur,
sondern aus einer Kommandodatei kommen.
Damit ist der sed für die Aufgabenstellung sehr gut geeignet.

Die sed Kommandos ähneln den vi Kommandos.
Wer sich gut mit dem vi auskennt, sollte auch schnell
mit dem sed klar kommen.

Zum Umgang mit dem sed kannst Du unter
http://www.linuxfibel.de/sed.htm
alles finden, was das Herz so begehrt.

Probiers erst mal selber aus.
Wenn Du nicht klar kommst, kann ich mich
immer noch hinsetzen und
ein kleines sed Script schreiben.

Gruss, vergisses

bei Antwort benachrichtigen
d-oli vergisses „Hi d-oli, zugegeben, zuerst sieht die Sache sehr kompliziert aus, aber wenn man...“
Optionen

Hi vergisses

Der Link ist wirklich gut. Ich werde es nächste Woche mal versuchen.

Nur eines würde mich jetzt schon interessieren. Kann ein regulärer Ausdruck auch über mehrere Zeilen gehen?

Bsp.: „/*\n** Class:“ was dann so ausehen würde

/*
** Class:

Ich möchte dies dann mit „/*! \class

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
vergisses d-oli „Hi vergisses Der Link ist wirklich gut. Ich werde es nächste Woche mal...“
Optionen

Hi d-oli,

versuchs mal mit v m, damit maskiere ich
jedenfalls im vi das CR.

Für Dein Beispiel würde ein Suchen/Ersetzen ungefähr so
aussehen:
s//\\*v m \*\*Class://\\*!v m \*\*Class:/

Mit Ctrl v leitet man alle Maskierungen ein, mit Ctrl
gibt man dann an, was maskiert werden soll.
Bei Dos Dateien muesstest Du wahrscheinlich auch noch
mit v l das NewLine dazunehmen.

Gruss, vergisses

P. S.
Das ctrl v usw. nicht abschreiben, sondern es sind
die entsprechenden Tastendrucke gemeint ;-)

bei Antwort benachrichtigen
d-oli vergisses „Hi d-oli, versuchs mal mit v m, damit maskiere ich jedenfalls im vi das CR. Für...“
Optionen

Ein regulaerer Ausdruck mit "new line" scheint nicht zu funktionieren. Es sieht so aus, als ob sed sich die letzte Zeile merkt und dann dort mit dem Einfuegen beginnt.

Bsp. ohne \n:
*************

$ sed 's#** Class:#**! Class:#' theclass.h
/*
**! Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Bsp. mit \n:
************

$ sed 's#/*\n** Class:#/*!\n** Class:#' theclass.h
/*
**/*!
** Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Und wieso wird "/*!" nach "**" eingefuegt und nicht vorher?
Hat es was mit '\n' oder gar mit '!' zu tun?

Noch ein Beispiel mit '!' nach '\n':
************************************
$sed 's#/*\n** Class:#/*\n!** Class:#' theclass.h
sed 's#/*\n** Class:#/*\n Class:#' theclass.h
/*
**/*
Class:
**
** Comment ...
**
*/
class TheClass{
public:
protected:
private:
};

Das passierte nach einer Fehleingabe ('!' nach '\n'). Sieht fuer mich so aus als ob '!' ein Steuerzeichen ist.

Tipps?

Dank und Gruss, d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
vergisses d-oli „ Ein regulaerer Ausdruck mit new line scheint nicht zu funktionieren. Es sieht...“
Optionen

Hallo d-oli,

ich war in den letzten Tagen unterwegs und hatte keinen
Internet Zugriff.

Ich schau mir die Sache mal an und melde mich dann.

Gruss, vergisses

bei Antwort benachrichtigen
d-oli vergisses „Hallo d-oli, ich war in den letzten Tagen unterwegs und hatte keinen Internet...“
Optionen

Hallo Vergisses

Danke für die Mühe. Ich habe inzwischen ein C-Programm geschrieben das ich mit $find . -name "*.h" -exec files {} \; aufrufe. Es funktioniert. Sind ca 40 Zeilen C-Code. Hab nur noch das Problem das am Ende der geänderten Datei (ASCII HEX) 13C, 102 und anderer Müll steht. Das werde ich aber in den Griff kriegen.

Trotzdem würde mich interessieren wie das mit sed geht. Ich habe inzwischen noch ein bisschen darüber gelesen. "n" bedeutet anscheinend, das der Befehl erst auf der nächsten Zeile ausgeführt wird. Es gibt auch noch andere Zeichen die in meinem Beispiel als Parameter verwechselt werden könnten "/" oder "*" z.B.

Dank und Gruss
d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
vergisses d-oli „Hallo Vergisses Danke für die Mühe. Ich habe inzwischen ein C-Programm...“
Optionen

Vielen Dank, dass Du mir die Mühen erspart hast.

sed und awk sind wirklich mächtig und interessante Werkzeuge.
Hier eine Buchempfehlung:
AWK und SED von Helmut Herold, Addison-Wesley, EUR 19,95
http://www.amazon.de/exec/obidos/ASIN/3827320941/qid=1089290247/sr=1-9/ref=sr_1_11_9/302-2297451-8070427

In diesem Buch wird auch auf ein paar Seiten auf reguläre
Ausdrücke eingegangen.
Will man mehr über reguläre Ausdrücke wissen, ist das Buch
Reguläre Ausdrücke von J.E.F. Friedl O´Reilly EUR 44,00 wohl
das deutschsprachige Standardwerk.
http://www.amazon.de/exec/obidos/ASIN/3897213494/qid=1089290638/sr=1-2/ref=sr_1_2_2/302-2297451-8070427

Gruss, vergisses

bei Antwort benachrichtigen