удалить только определенные вхождения текста из строки с помощью 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простым способом, но вы можете обойти это. Вот один из таких методов: использование односимвольного заполнителя для двухсимвольного конечного разделителя. Использование шестнадцатеричного значения \x01в качестве заменяющих символов безопасно (т. е. не будет конфликтовать с существующим текстом), так как его нет в обычном тексте.

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

perl, с другой стороны, может опционально обрабатывать lazyсопоставление (и многое другое). Как уже упоминалосьПринц Джон Уэслив комментариях, вотленивый perlэквивалент.

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

решение2

Попробуй это:

sed 's@/\*[^/]*\*/@@'

К сожалению, могут возникнуть трудности с комментариями /внутри.

Возможно, будет полезно объединить два варианта: чтобы быть уверенным, что удалены абсолютно все комментарии:

sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'

Связанный контент