Ищу простой способ удалить все мои TODO: комментарии во всем каталоге скриптов.
Если у меня есть:
/*
TODO: Some text here
Some more Here
Some more Here
*/
Я хочу удалить / * все, что находится между ними и * / Ничего особенного, просто интересно, как уменьшить размер файлов
Linux .. не уточнял
И да, я просмотрел сотни ответов, которые взламывают код. Спасибо, что посмотрели :)
Возможный дубликат Используйте Bash (sed?), Чтобы удалить многострочный комментарий стиля / * ... * /, содержащий определенный текст (регулярное выражение)
Конечно посмотрел но видимо не хватило ...
Пожалуйста, избегайте вопросов "Дай мне код". Вместо этого покажите сценарий, над которым вы работаете, и укажите, в чем проблема. Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?
В прошлый раз, когда я опубликовал код, люди жаловались, что он слишком длинный. Спасибо, что указали на @Zlemini, я, должно быть, пропустил это после 30-часового запоя кодирования.
Оцените аргументированность @NPE
легко сделать на php, я просто написал одну, чтобы извлечь одну таблицу из большого дампа MySQL. Та же идея.
Спасибо, я тоже займусь этим. RegEx может вызвать проблемы, если форматирование некрасиво. @ArtisticPhoenix
Кто что сказал про Regex? github.com/ArtisticPhoenix/MISC/blob/master/extract_table/… Если вы посмотрите на нижнюю часть, в нем мало или совсем нет регулярных выражений. Вам могут понадобиться некоторые для учета случайного места на \s/*
. но как бы там ни было. Он читает и записывает строку за строкой, вы можете читать свой файл PHP по одной строке за раз, затем, когда вы нажимаете /*
, проверьте следующую строку на наличие @todo
, если он присутствует, не пишите, пока не нажмете */
simple.
Я запустил это против дампа sql 36GB
и вытащил 120 some MB
данных. Это были старые данные биллинга с нашего сервера, полученные 2 года назад. На пробежку ушло около 5 минут.
Ссылка выше была командой sed. Смешанные результаты в прошлом
Этот сценарий выглядит как то, что мне нужно как надежная отправная точка, я ценю это. @ArtisticPhoenix
Вот с чего начать:
$file = 'somefile.php';
$f = fopen($file,'r');
$temp = dirname($file).'/temp.php';
print_r($temp);
$t = fopen($temp, 'w');
$mode = 'write';
$buffer = [];
while($line=fgets($f)){
print_r($mode."\n");
switch($mode){
case 'write':
if (preg_match('/^\s*/\\*/', $line)){
$buffer[] = $line;
$mode = 'comment';
}else{
fputs($t,$line);
}
break;
case 'comment':
if (preg_match('/^\s*\\**\s*@TODO/i', $line)){
$buffer = [];
$mode = 'skip';
}else if (preg_match('/^\s*\\*//', $line)){
fwrite($t,implode("", $buffer));
$buffer = [];
fputs($t,$line);
$mode = 'write';
}else{
$buffer[] = $line;
}
break;
case 'skip':
if (preg_match('/^\s*\\*//', $line)){
$mode = 'write';
}
break;
}
}
/*
fclose($t);
fclose($f);
rename($temp, $file);
*/
Я тестировал это с этим файлом
<?php
$var= "foo";
/*
@todo hello
some other shuff
*/
/**
*
* @author Me
*
*/
class someclass{
}
Это было то, что было в temp.php
<?php
$var= "foo";
/**
*
* @author Me
*
*/
class someclass{
}
Надеюсь, это поможет. Я бы, вероятно, сделал резервную копию ваших файлов, прежде чем пытаться это сделать.
ОБНОВИТЬ
Пришлось исправить пару мелких вещей, чтобы комментарии пропускались без @todo
. С остальным вы, вероятно, довольно легко справитесь.
Регулярное выражение предназначено только для учета пробелов или комментариев, подобных этому.
/*
* @todo
*/
Этот \\*
становится \*
для механизма регулярных выражений, который затем становится буквальным *
.
Так вот этот \s*/\\*
\s*
- ни одного или более пробелов/
- буквально /
\\*
- буквально *
Или на английском языке тег открытого комментария /*
.
Я упоминаю об этом, потому что регулярное выражение сложно, но у вас, вероятно, есть пробелы и другие вещи, вероятно, каждый @todo
- не самое первое, что на линии.
Поступая таким образом, вы можете обрабатывать каждую строку отдельно, это упрощает работу и, что более важно, увеличивает точность сопоставления.
И смотрели на своей любимой поисковой системе и читали документацию по PowerShell? Как вы говорите, ничего особенного не должно быть.