我有一些分布在某些目录中的.css文件。我需要找到那些.css文件,读取它们,如果它们包含特定的类定义,则将其打印到屏幕上。
例如,我正在寻找“.ExampleClass”并且它存在于/includes/css/MyStyle.css中,我希望打印shell命令
.ExampleClass {
color: #ff0000;
}
答案 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
}