次のような内容の行が多数含まれたテキスト ファイルがあります。
/*[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';
何かで始まる行全体を削除するには を使用する方法を知っています。SQLsed
を含むテキスト ファイルの例では、ハッシュ記号である可能性があります#
。
答え1
sed
は、ある方法で一致するためgreedy
、コメントの末尾以降のテキストが、先行する実際のコメント終了マーカーの代わりに一致する可能性が常にあります。たとえば、引用符で囲まれた文字列に「*/」が含まれている場合などです。
これは簡単な方法では処理できませんsed
が、回避することはできます。その方法の 1 つを次に示します。2 文字の終了区切り文字に 1 文字のプレースホルダーを使用します。16 進値を\x01
代替文字として使用すると、通常のテキストには存在しないため安全です (つまり、既存のテキストと衝突しません)。
sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"
perl
一方、はオプションでlazy
マッチング(およびその他多くの処理)を処理できます。すでに述べたように、ジョン・ウェスレー王子コメント欄には、怠け者 perl
同等。
perl -ple 's|/\*.*?\*/||g' "$file"
答え2
これを試してみてください:
sed 's@/\*[^/]*\*/@@'
残念ながら、内部のコメントに問題がある可能性があります/
。
おそらく、2 つのバリエーションを一緒に使用すると便利です。すべてのコメントが確実に削除されるようにするためです。
sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'