GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Alle C-Kommentare mit Sed löschen?

Für diese Frage gibt es hier bereits Antworten :Wie kann ich alle Zeichen löschen, die unter /* … */ fallen, einschließlich /* &*/?

(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.


Linux
  1. Auflisten aller E-Mail-Adressen in einer Datei mit grep

  2. Wie erreicht man Portabilität mit Sed -i (In-Place-Editing)?

  3. Ergänzung mit „sed“?

  4. Wie kombinieren Sie alle Zeilen, die mit einem Backslash-Zeichen enden?

  5. So entfernen Sie \r-Zeichen mit sed

Kommentare mit PDF drucken?

Wie kann man Zeichen rekursiv durch sed ersetzen?

Null-Füllen Sie Zahlen mit sed auf 2 Ziffern

Regulärer Ausdruck mit sed

Wie liste ich alle Benutzer mit root auf?

sed ersetzt alle Tabulatoren und Leerzeichen durch ein einzelnes Leerzeichen