Ich habe eine Textdatei, die viele Zeilen mit folgenden Inhalten enthält:
/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
Gibt es eine Möglichkeit, sed
die Kommentare zu entfernen ?nur, also alles, was mit einem beginnt /*
und mit einem endet */
? Die Zeile würde dann lauten:
UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
Ich weiß, wie man sed
eine ganze Zeile entfernt, die mit etwas beginnt. Im Beispiel einer Textdatei mit SQL wäre dies wahrscheinlich ein Hash-Symbol #
.
Antwort1
Da sed
auf eine greedy
bestimmte Weise abgeglichen wird, besteht immer die Möglichkeit, dass Text nach dem Ende des Kommentars abgeglichen wird, anstatt der vorangehenden echten Kommentarendemarkierung, z. B. in einer in Anführungszeichen gesetzten Zeichenfolge, die „*/“ enthält.
Dies kann nicht auf einfache Weise behandelt werden sed
, aber Sie können es umgehen. Hier ist eine solche Methode: Verwenden Sie einen einstelligen Platzhalter für das zweistellige Endtrennzeichen. Die Verwendung von Hexadezimalwerten \x01
als Ersatzzeichen ist sicher (d. h. es kollidiert nicht mit vorhandenem Text), da sie in normalem Text nicht vorhanden sind.
sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"
perl
kann dagegen optional lazy
Matching (und vieles mehr) übernehmen. Wie bereits erwähnt vonPrinz John Wesleyin den Kommentaren, hier ist diefaul perl
Äquivalent.
perl -ple 's|/\*.*?\*/||g' "$file"
Antwort2
Probier diese:
sed 's@/\*[^/]*\*/@@'
Leider kann es bei Kommentaren im /
Inneren zu Problemen kommen.
Vielleicht ist es sinnvoll, zwei Varianten zusammen zu verwenden, um sicherzustellen, dass wirklich alle Kommentare entfernt werden:
sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'