Сценарий оболочки или команда для удаления всего текста между начальным и конечным символами во всем каталоге

Ищу простой способ удалить все мои TODO: комментарии во всем каталоге скриптов.

Если у меня есть:

/*
TODO: Some text here
Some more Here
Some more Here
*/

Я хочу удалить / * все, что находится между ними и * / Ничего особенного, просто интересно, как уменьшить размер файлов

И смотрели на своей любимой поисковой системе и читали документацию по PowerShell? Как вы говорите, ничего особенного не должно быть.

PilouPili 11.09.2018 23:37

Linux .. не уточнял

Micah Yarborough 11.09.2018 23:38

И да, я просмотрел сотни ответов, которые взламывают код. Спасибо, что посмотрели :)

Micah Yarborough 11.09.2018 23:45

Конечно посмотрел но видимо не хватило ...

PilouPili 12.09.2018 00:03

Пожалуйста, избегайте вопросов "Дай мне код". Вместо этого покажите сценарий, над которым вы работаете, и укажите, в чем проблема. Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

jww 12.09.2018 00:31

В прошлый раз, когда я опубликовал код, люди жаловались, что он слишком длинный. Спасибо, что указали на @Zlemini, я, должно быть, пропустил это после 30-часового запоя кодирования.

Micah Yarborough 12.09.2018 01:16

Оцените аргументированность @NPE

Micah Yarborough 12.09.2018 01:16

легко сделать на php, я просто написал одну, чтобы извлечь одну таблицу из большого дампа MySQL. Та же идея.

ArtisticPhoenix 12.09.2018 01:19

Спасибо, я тоже займусь этим. RegEx может вызвать проблемы, если форматирование некрасиво. @ArtisticPhoenix

Micah Yarborough 12.09.2018 01:24

Кто что сказал про Regex? github.com/ArtisticPhoenix/MISC/blob/master/extract_table/… Если вы посмотрите на нижнюю часть, в нем мало или совсем нет регулярных выражений. Вам могут понадобиться некоторые для учета случайного места на \s/*. но как бы там ни было. Он читает и записывает строку за строкой, вы можете читать свой файл PHP по одной строке за раз, затем, когда вы нажимаете /*, проверьте следующую строку на наличие @todo, если он присутствует, не пишите, пока не нажмете */ simple.

ArtisticPhoenix 12.09.2018 01:26

Я запустил это против дампа sql 36GB и вытащил 120 some MB данных. Это были старые данные биллинга с нашего сервера, полученные 2 года назад. На пробежку ушло около 5 минут.

ArtisticPhoenix 12.09.2018 01:32

Ссылка выше была командой sed. Смешанные результаты в прошлом

Micah Yarborough 12.09.2018 01:45

Этот сценарий выглядит как то, что мне нужно как надежная отправная точка, я ценю это. @ArtisticPhoenix

Micah Yarborough 12.09.2018 01:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
14
38
1

Ответы 1

Вот с чего начать:

$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 - не самое первое, что на линии.

Поступая таким образом, вы можете обрабатывать каждую строку отдельно, это упрощает работу и, что более важно, увеличивает точность сопоставления.

Другие вопросы по теме