Entfernen Sie mit sed nur bestimmte Textvorkommen aus der Zeichenfolge

Entfernen Sie mit sed nur bestimmte Textvorkommen aus der Zeichenfolge

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, seddie 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 sedeine ganze Zeile entfernt, die mit etwas beginnt. Im Beispiel einer Textdatei mit SQL wäre dies wahrscheinlich ein Hash-Symbol #.

Antwort1

Da sedauf eine greedybestimmte 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 \x01als 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"

perlkann dagegen optional lazyMatching (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@/\*[^*]*\*/@@;'

verwandte Informationen