Использование BASH - Найти блок CSS или определение и распечатать на экране - PullRequest
1 голос
/ 20 апреля 2010

У меня есть несколько файлов .css, распределенных по некоторым каталогам. Мне нужно найти эти .css файлы, прочитать их и, если они содержат определенное определение класса, распечатать его на экране.

Например, я ищу ".ExampleClass", и он существует в /include/css/MyStyle.css, я бы хотел, чтобы команда оболочки напечатала

.ExampleClass {
color: #ff0000;
}

Ответы [ 5 ]

4 голосов
/ 20 апреля 2010

Используйте поиск, чтобы отфильтровать все файлы css и выполнить сценарий sed для этих файлов, печатая строки между двумя регулярными выражениями:

find ${DIR} -type f -name "*.css" -exec sed -n '/\.ExampleClass.{/,/}/p' \{\} \+
0 голосов
/ 20 апреля 2010

Эта версия обрабатывает многострочные блоки, а также блоки в одной строке:

sed -n '/^[[:space:]]*\.ExampleClass[[:space:]]*{/{p;q}; /^[[:space:]]*\.ExampleClass[[:space:]]*{/,/}/p'

Примеры:

foo { bar }

или

foo {
        bar
}
0 голосов
/ 20 апреля 2010

Предполагая, что вы никогда не делаете ничего странного, например, ставите открывающую скобку на отдельной строке или ставите незаштрихованную (вложенную) закрывающую скобку перед намеченной, вы можете сделать это:

sed -n '/\.ExampleClass *{/,/^}/p' *.css

А если файлы по всей структуре каталогов:

find . -name *.css | xargs sed ...
0 голосов
/ 20 апреля 2010

Учитывая, что файл css может иметь многострочные определения классов, и что в одном и том же файле может быть несколько вхождений, я бы поспорил, что perl - это то, что нужно.

Например:

#input: css filename , and css class name without dot (in the example, ExampleClass)
my ($filen,$classn) = @ARGV;  
my $out = findclassuse($filen,$classn);
# print filename and result if non empty
print ("===== $filen : ==== \n" . $out . "\n") if ($out); 

sub findclassuse {
    my ($filename,$classname) = @_;
    my $output = "";
    open(my $fh, '<', $filename) or die $!;
    $/ = undef; # so that i read the full file content
    my $css  = <$fh>;
    $css =~ s#/\*.*?\*/# #g; # strip out comments
    close $fh;
    while($css =~ /([^}{]*\.$classname\b.*?{.*?})/gs) {
        $output .= "\n\n"  . $1;
    }
    return $output;
}

Но это не на 100% надежно, есть некоторые проблемы с комментариями, и разбор CSS, безусловно, не идеален.

0 голосов
/ 20 апреля 2010
find /starting/directory -type f -name '*.css' | xargs -ti grep '\.ExampleClass' {}

найдет все файлы css, напечатает имя файла и строку поиска, а затем напечатает результаты grep.Вы можете передать вывод через sed для удаления ненужного текста.

ETA: регулярное выражение должно работать, если мы хотим перехватить многострочные выраженияВероятно, символ EOL должен быть установлен на }, чтобы завершенные классы считались одной строкой.Если бы это было сделано, то использование find вместо grep было бы более эффективным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...