【问题标题】:Bash script to find file name that containts specific range of numbers用于查找包含特定数字范围的文件名的 Bash 脚本
【发布时间】:2015-03-03 22:08:20
【问题描述】:

我有一堆 .NFO 文件,其中包含有关电影的元数据(基本上是 XML 格式)。我想创建一个循环遍历所有 .NFO 文件并列出包含等于或小于 5.0 的评级的文件名的 bash 脚本。评级放置在 XML 标记 <rating>number</rating>

我能够使用grep 在文本文件中找到一个特定的单词,它适用于:

grep "rating" . -R

结果是movie_name.nfo: <rating>7.5</rating>

我尝试了以下方法,但没有成功:

grep "<rating>[0.0-9.0]</rating>" . -R

提前致谢

【问题讨论】:

  • 范围不能像正则表达式那样工作。更多地将其视为字符集中的连续字符。

标签: xml linux bash shell grep


【解决方案1】:

使用 GNU grep:

grep -oP '<rating>\K(5\.0|[0-4]\.[0-9])(?=<)'

输出(例如)

4.3

【讨论】:

    【解决方案2】:

    试试这个 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
    

    【讨论】:

    • @heemyl:这看起来很有希望,但是如果我对电影元数据文件使用它,那么它将检索文件中的所有其他数字。我尝试了以下方法,它在检索 7.5: grep -Eo "[[:digit:]]+\.[[:digit:]]+" 但如何在这种情况下,我可以找到小于或等于数字的数字吗?
    【解决方案3】:

    我建议使用xml 解析器,例如perl 语言的XML::Twig。它是一个简单的程序,依赖于您正在使用的 shell,可以使用正则表达式语法调用它,以在同一命令中传递多个文件。代码很简单:

    #!/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*
    

    它将输出包含任何&lt;rating&gt;元素且值低于5的每个文件的名称。

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2020-02-03
      • 2014-07-23
      • 1970-01-01
      • 2013-03-04
      • 2021-06-26
      相关资源
      最近更新 更多