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';

何かで始まる行全体を削除するには を使用する方法を知っています。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@/\*[^*]*\*/@@;'

関連情報