次のような多くの行を含むテキストファイルがあります。
/*[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"