繁体   English   中英

Bash脚本查找包含特定数字范围的文件名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM