Shell脚本或命令删除整个目录中的起始字符和结束字符之间的所有文本

问题描述 投票:-1回答:1

寻找一种简单的方法来删除我的所有TODO:整个脚本目录中的注释。

如果我有:

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

我想删除/ * Everything in Between和* /并不是一个大问题,只是想知道减少文件大小

php linux shell command-line comments
1个回答
0
投票

这是一个开始:

$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{



}

希望能帮助到你。在尝试此操作之前,我可能会备份您的文件。

UPDATE

不得不修复一些小的东西,所以它会跳过没有@todo的评论。其余的你可以很容易地解决。

正则表达式只是为了考虑这样的空格或注释

/*
* @todo
*/

这个\\*成为正则表达式引擎的\*,然后成为字面上的*

所以这一个\s*\/\\*

  • \s* - 没有或多个空格
  • \/ - /字面意思
  • \\* - *字面意思

或者用英语/*打开评论标签。

我之所以提到这一点是因为正则表达式很棘手,但你可能还有空格和其他内容,可能每个@todo都不是第一件事。

像这样做,你可以自己处理每一行,它简化了事情,更重要的是提高了匹配的准确性。

© www.soinside.com 2019 - 2024. All rights reserved.