Если у вас нет обильных комментариев (которые относительно легко удаляются) и удаляются начальные пробелы в строках, где это не имеет существенного значения (и пустые строки), тогда не остается много сжатия.
Я провел грубый тест на 424 различных сценариях оболочки, которые я написал за эти годы, и там было 16561 строка ввода (386008 символов) и 11992 строки вывода (278349 символов). Таким образом, экономия составила около 28%.
Я использовал этот почти тривиальный сценарий Perl (который ни в каком смысле не был оптимизирован; изначально он собирался записывать в отдельный выходной файл для каждого входного файла - отсюда явная обработка файла вместо простого цикла while (<>)
):
#!/usr/bin/env perl
use strict;
use warnings;
foreach my $file (@ARGV)
{
open my $fh, "<", $file or die "Failed to open $file";
my $line = <>;
print $line;
while ($line = <>)
{
next if $line =~ m/^#/;
next if $line =~ m/^\s*$/;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
print $line;
}
close $fh;
}
Это оставляет первую строку (как правило, строку shebang, хотя многие из моих сценариев достаточно стары - и не предназначены для работы достаточно долго - что они используют :
вместо shebang) без изменений. Это не пытается убрать конечные комментарии (пробелы, хэш, другие символы), но я не склонен использовать многие из них. Добавление команды замены:
$line =~ s/\s+#[^\\'"`]*$//;
оставил мне 275035 символов из моего корпуса (и экономию около 29%). Замена всех первых строк на '#!/bin/sh
' экономит немного больше. Около 700 строк содержат несколько последовательных пробелов или вкладок, но дополнительная экономия места при их сжатии довольно ограничена (и многие из них ищут комбинации «пустые или табуляции», которые не должны сжиматься).
Ясно, что если экономии приблизительно 1/3 места достаточно, то этот сценарий может быть полезным, хотя и упрощенным. Сократить пространство намного сложнее, однако, без серьезного риска повреждения сценариев, которые вы минимизируете.