[英]Bash script to find file name that containts specific range of numbers
我有一堆.NFO文件,其中包含有关电影的元数据(基本上是XML格式)。 我想创建一个bash脚本,该脚本循环遍历所有.NFO文件,并列出包含等于或小于5.0的评分的文件名。 评级放置在XML标记<rating>number</rating>
。
我能够使用grep
在文本文件中找到一个特定的单词,它适用于:
grep "rating" . -R
结果是movie_name.nfo: <rating>7.5</rating>
我尝试了以下操作,但没有成功:
grep "<rating>[0.0-9.0]</rating>" . -R
提前致谢
使用GNU grep:
grep -oP '<rating>\K(5\.0|[0-4]\.[0-9])(?=<)'
输出(例如)
4.3
试试这个gnu grep
解决方案:
echo "movie_name.nfo: <rating>4.5</rating>" | grep -Eo "[0-4]\.[[:digit:]]+|5\.0"
4.5
在这里,我们使用扩展的正则表达式来匹配小于或等于5.0
的任何值,方法是匹配5.0
或0到4之间的任何数字,然后匹配文字点,然后匹配一个或多个出现的数字(0-9)。
根据您的评论,您可以尝试以下sed
解决方案,该解决方案将确保不会选择任何不必要的值:
sed -nr 's/.*<rating>([0-4]\.[[:digit:]]+|5\.0).*/\1/p' file.txt
我建议一个xml
解析器,例如perl
语言的XML::Twig
。 它是一个简单的程序,取决于您使用的外壳,可以使用正则表达式语法调用它以在同一命令中传递许多文件。 代码很简单:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
for my $f (@ARGV) {
XML::Twig->new(
twig_handlers => {
'rating' => sub {
printf qq|%s\n|, $f if $_->text_only && $_->text_only < 5;
},
},
)->parsefile($f);
}
并称为:
perl script.pl xmlfile*
它将输出包含任何<rating>
元素且值小于5的每个文件的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.