Самый простой способ удалить все пробелы из файла кода? - PullRequest
2 голосов
/ 19 ноября 2009

Я участвую в одном из соревнований Code Golf , где чем меньше размер файла, тем лучше.

Вместо того, чтобы вручную удалять все пробелы и т. Д., Я ищу программу или веб-сайт, который будет принимать файл, удалять все пробелы (включая новые строки) и возвращать компактную версию файла. Есть идеи?

Ответы [ 7 ]

8 голосов
/ 19 ноября 2009

Вы можете использовать:

sed 's/\s\s+/ /g' youfile > yourpackedfile`

Существует также этот онлайн-инструмент .

Вы даже можете сделать это на PHP (как чудесна жизнь):

$data = file_get_contents('foobar.php');
$data = preg_replace('/\s\s+/', ' ', $data);
file_put_contents('foobar2.php', $data);

Вы должны заметить, что это не позаботится о строковой переменной, такой как $bar = ' asd aa a';, это может быть проблемой в зависимости от того, что вы делаете. Онлайн-инструмент, кажется, справляется с этим правильно.

2 голосов
/ 19 ноября 2009
$ tr -d ' \n' <oldfile >newfile
1 голос
/ 07 июня 2016

Это функция PHP, которая сделает всю работу за вас:

function compress_php_src($src) {

    // Whitespaces left and right from this signs can be ignored
    static $IW = array(
        T_CONCAT_EQUAL,             // .=
        T_DOUBLE_ARROW,             // =>
        T_BOOLEAN_AND,              // &&
        T_BOOLEAN_OR,               // ||
        T_IS_EQUAL,                 // ==
        T_IS_NOT_EQUAL,             // != or <>
        T_IS_SMALLER_OR_EQUAL,      // <=
        T_IS_GREATER_OR_EQUAL,      // >=
        T_INC,                      // ++
        T_DEC,                      // --
        T_PLUS_EQUAL,               // +=
        T_MINUS_EQUAL,              // -=
        T_MUL_EQUAL,                // *=
        T_DIV_EQUAL,                // /=
        T_IS_IDENTICAL,             // ===
        T_IS_NOT_IDENTICAL,         // !==
        T_DOUBLE_COLON,             // ::
        T_PAAMAYIM_NEKUDOTAYIM,     // ::
        T_OBJECT_OPERATOR,          // ->
        T_DOLLAR_OPEN_CURLY_BRACES, // ${
        T_AND_EQUAL,                // &=
        T_MOD_EQUAL,                // %=
        T_XOR_EQUAL,                // ^=
        T_OR_EQUAL,                 // |=
        T_SL,                       // <<
        T_SR,                       // >>
        T_SL_EQUAL,                 // <<=
        T_SR_EQUAL,                 // >>=
    );

    if(is_file($src)) {
        if(!$src = file_get_contents($src)) {
            return false;
        }
    }

    $tokens = token_get_all($src);

    $new = "";
    $c = sizeof($tokens);
    $iw = false; // Ignore whitespace
    $ih = false; // In HEREDOC
    $ls = "";    // Last sign
    $ot = null;  // Open tag
    for($i = 0; $i < $c; $i++) {
        $token = $tokens[$i];

        if(is_array($token)) {
            list($tn, $ts) = $token; // tokens: number, string, line
            $tname = token_name($tn);

            if($tn == T_INLINE_HTML) {
                $new .= $ts;
                $iw = false;
            }
            else {
                if($tn == T_OPEN_TAG) {

                    if(strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) {
                        $ts = rtrim($ts);
                    }

                    $ts .= " ";
                    $new .= $ts;
                    $ot = T_OPEN_TAG;
                    $iw = true;

                } elseif($tn == T_OPEN_TAG_WITH_ECHO) {

                    $new .= $ts;
                    $ot = T_OPEN_TAG_WITH_ECHO;
                    $iw = true;

                } elseif($tn == T_CLOSE_TAG) {

                    if($ot == T_OPEN_TAG_WITH_ECHO) {
                        $new = rtrim($new, "; ");
                    } else {
                        $ts = " ".$ts;
                    }
                    $new .= $ts;
                    $ot = null;
                    $iw = false;

                } elseif(in_array($tn, $IW)) {

                    $new .= $ts;
                    $iw = true;

                } elseif($tn == T_CONSTANT_ENCAPSED_STRING
                       || $tn == T_ENCAPSED_AND_WHITESPACE)
                {

                    if($ts[0] == '"') {
                        $ts = addcslashes($ts, "\n\t\r");
                    }
                    $new .= $ts;
                    $iw = true;

                } elseif($tn == T_WHITESPACE) {

                    $nt = @$tokens[$i+1];
                    if(!$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) {
                        $new .= " ";
                    }
                    $iw = false;

                } elseif($tn == T_START_HEREDOC) {

                    $new .= "<<<S\n";
                    $iw = false;
                    $ih = true; // in HEREDOC

                } elseif($tn == T_END_HEREDOC) {

                    $new .= "S;";
                    $iw = true;
                    $ih = false; // in HEREDOC
                    for($j = $i+1; $j < $c; $j++) {
                        if(is_string($tokens[$j]) && $tokens[$j] == ";") {
                            $i = $j;
                            break;
                        } else if($tokens[$j][0] == T_CLOSE_TAG) {
                            break;
                        }
                    }

                } elseif($tn == T_COMMENT || $tn == T_DOC_COMMENT) {

                    $iw = true;

                } else {

                    if(!$ih) {
                        $ts = strtolower($ts);
                    }
                    $new .= $ts;
                    $iw = false;
                }
            }
            $ls = "";

        }
        else {
            if(($token != ";" && $token != ":") || $ls != $token) {
                $new .= $token;
                $ls = $token;
            }
            $iw = true;
        }
    }
    return $new;
}
// This is an example
$src = file_get_contents('foobar.php');
file_put_contents('foobar3.php',compress_php_src($src));
1 голос
/ 19 ноября 2009

В PowerShell (v2) это можно сделать с помощью следующего небольшого фрагмента:

(-join(gc my_file))-replace"\s"

или более:

(-join (Get-Content my_file)) -replace "\s"

Он объединит все строки вместе и удалит все пробелы и символы табуляции.

Однако для некоторых языков вы, вероятно, не хотите этого делать. Например, в PowerShell вам не нужны точки с запятой, если вы не помещаете несколько операторов в одну строку, поэтому код такой как

while (1) {
    "Hello World"
    $x++
}

станет

while(1){"HelloWorld"$x++}

при применении вышеупомянутых заявлений наивно. Это и изменило смысл и синтаксическую правильность программы. Вероятно, не слишком много, чтобы высматривать в числовых решениях гольфа, но проблема со связанными линиями все еще остается, к сожалению. Простая точка с запятой между каждой строкой на самом деле тоже не помогает.

0 голосов
/ 19 ноября 2009

Запустите php -w на нем!

php -w myfile.php

В отличие от регулярного выражения, оно достаточно умное, чтобы оставлять строки в покое, а также удаляет комментарии.

0 голосов
/ 19 ноября 2009

Блокнот ++ - неплохой редактор, если вы работаете в Windows, и в нем есть много предопределенных макросов, обрезка кода и удаление пробелов между ними.

Он может выполнять регулярные выражения и имеет множество функций, которые помогут хакеру кода или сценаристу.

Сайт Notepad ++

0 голосов
/ 19 ноября 2009

Если ваши программы-редакторы кода поддерживают регулярные выражения , вы можете попробовать это:

Find this: [\r\n]{2,}
Replace with this: \n
Then Replace All
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...