使用BASH - 查找CSS块或定义并打印到屏幕

时间:2010-04-20 17:21:13

标签: regex bash unix terminal

我有一些分布在某些目录中的.css文件。我需要找到那些.css文件,读取它们,如果它们包含特定的类定义,则将其打印到屏幕上。

例如,我正在寻找“.ExampleClass”并且它存在于/includes/css/MyStyle.css中,我希望打印shell命令

.ExampleClass {
color: #ff0000;
}

5 个答案:

答案 0 :(得分:4)

使用find过滤所有 css 文件,并在两个正则表达式之间的那些文件打印行上执行sed脚本:

find ${DIR} -type f -name "*.css" -exec sed -n '/\.ExampleClass.{/,/}/p' \{\} \+

答案 1 :(得分:0)

find /starting/directory -type f -name '*.css' | xargs -ti grep '\.ExampleClass' {}

将找到所有css文件,打印文件名和搜索字符串,然后打印grep的结果。您可以通过sed管道输出以删除任何不必要的文本。

ETA:如果我们想要捕获多行表达式,正则表达式需要工作。可能EOL字符应设置为},以便将完整的类视为一行。如果这样做了,那么将find换成perl -e而不是grep会更有效

答案 2 :(得分:0)

考虑到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;
}

但这不是百分之百的万无一失,评论仍然存在一些问题,而css解析肯定不是完美的。

答案 3 :(得分:0)

假设你从不做任何奇怪的事情,比如将开口支架放在一个单独的线上,或者在预期的支架上放置一个未缩进的(嵌套的)支撑架,你可以这样做:

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

如果文件遍布目录结构:

find . -name *.css | xargs sed ...

答案 4 :(得分:0)

此版本在一行上处理多行块和块:

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

示例:

foo { bar }

foo {
        bar
}