sedを使用して文字列から特定のテキストのみを削除する

sedを使用して文字列から特定のテキストのみを削除する

次のような多くの行を含むテキストファイルがあります。

/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36'; 

sedコメントを削除する方法はありませんか?ただ/*、これはaで始まり、aで終わるすべてです*/。これにより、次のような行になります。

UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';

私は何かで始まる行全体を削除する方法を知っていますsed。 SQLを含むテキストファイルの例では、ハッシュ記号です#

ベストアンサー1

sed一致は特定の方法で行われるため、greedy例えば、実際のコメント終了タグの前のテキストではなく、コメント終了後のテキストを一致させることは常に可能である。たとえば、「*/」を含む引用符付き文字列です。
この問題は簡単な方法では処理できませんが、sed解決することはできます。以下はそのようなアプローチの1つです。単一文字のプレースホルダを 2 文字の閉じ区切り記号として使用します。 16進値は\x01プレーンテキストには存在しないため、代替文字として使用するのは安全です(つまり、既存のテキストと競合しません)。

sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"

perl一方、lazyマッチングなどを処理するオプションもあります。すでに述べたようにジョン・ウェスリー王子コメントにこのような内容があります。怠惰 perl同じ。

perl -ple 's|/\*.*?\*/||g' "$file"

おすすめ記事