(9 Antworten)
Vor 4 Jahren geschlossen.
Ich versuche, ein Skript zu schreiben, das alle Kommentare und alles dazwischen in C-Dateien in meinem aktuellen Verzeichnis löscht. Ich habe sed
verwendet , und das ist, was ich bisher habe:
sed -i '/ * [^()] */d' *.c
Dies funktioniert, wenn die Kommentare in derselben Zeile wie ein Sternchen oder Backslash stehen.
Es funktioniert jedoch nicht, wenn es eine kommentierte Zeile ohne Schrägstrich oder Sternchen gibt.
Ich weiß, dass sed Zeile für Zeile geht, ich weiß nur nicht, wie ich ihm sagen soll, dass er weiter löschen soll, bis er einen */
sieht .
Akzeptierte Antwort:
Das Entfernen von Kommentaren ohne Verwendung eines echten C-Präprozessors ist nicht gerade trivial. Mir ist mal so etwas eingefallen:
perl -0777 -pe'
s{
/*.*?*/
| //[^n]*
| (
"(?:\.|.)*?"
| '''(?:\.)?.*?'''
| ??'''
| .[^'''"/]*
)
}{if ($1eq""){" "}else{$1}}exsg'
Das sollte die meisten Fälle abdecken wie:
printf("%c%c%s", '"' /* d-quote */, ''', "/*" "*/");
Weitere Einzelheiten finden Sie in der interessanten Diskussion dort.