У меня есть текстовый файл, содержащий много строк такого рода:
/*[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@/\*[^*]*\*/@@;'