如何查找字符串中是否缺少一系列非浮点数字

时间:2018-08-22 01:02:46

标签: bash

在Bash中

我想在字符串中找到一系列非浮点数字。

如果我有这样的字符串:

'.data[] | select(.memberships[].section.name == "In_Development" and .custom_fields[].name == "repo")  | (.name, .custom_fields[].enum_value.name)'

我想查找数字firstNum-lastNum是否丢失。说,如果

"1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg 4.5.jpg"

该函数将返回

“缺少1个,缺少2个,缺少5个”

在字符串中查找非浮点数字相对容易,但令我的脚本困惑的是字符串的“ 2.005.jpg”部分。我的脚本无法理解如何识别5是浮点数2的一部分,因此应该忽略它。

我只想说数字是前导零还是“ [0-9]”。在它前面,忽略它。但不幸的是,我需要支持任意数量的前导零的数字。

2 个答案:

答案 0 :(得分:2)

如果您不反对使用awk,则可以使用以下脚本:

echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \
   awk -v min=1 -v max=5 -v RS="[^0-9. ]+" '
     ($0+0)!~/\./&&/[0-9]+/{a[$0+0]}
     END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}'

这是一个GNU awk脚本,它依赖于记录分隔符RS来分隔仅包含(浮点)数字的行。

诀窍是在找到的数字上加上0,并检查数字是否仍为十进制形式(不带任何点.)。如果是这样,数字将存储在数组a中。

END语句正在从min(1)到max(5)的所有十进制数字之间循环,并在该数字不属于数组{{1 }}。

与posix兼容的替代脚本如下:

a

主要区别在于使用了echo "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" | \ awk -v min=1 -v max=5 ' { split($0,n,"[^0-9. ]+"); for(i in n){ if((n[i]+0)!~/\./&&n[i]~/[0-9]+/){ a[n[i]+0] } } } END{for(i=min;i<=max;i++)if(!(i in a))print i " is missing"}' 函数来代替split()RS中断输入字符串,并将数字放入数组split中。然后检查数组元素,如果是十进制数,则将其放在数组n中。

答案 1 :(得分:1)

可能的答案:

这里有一个bash函数,以一种(希望的)合理的方式给出了所提供的测试用例的预期输出值:

function check_missing {
    prefix=""
    for i in {1..5}; do
        # make sure that $i is present, 
        # with optional leading zeroes,
        # but with at least one non-number
        # *before* the zeroes and *after* $i
        if ! [[ "$1" =~ .*[^0-9\.]0*"$i"\.?[^0-9\.].* ]]; then 
            echo -n "${prefix}${i} is missing"
            prefix=", "
        fi
    done
    echo
}

我不确定这对您所拥有的其他输入的一般化程度(或输出格式的重要性),但希望它至少可以为解决问题提供一个思路。

示例输出:

> check_missing "001.004.jpg 2.005.jpg 003.jpg Blah4.jpg"
1 is missing, 2 is missing, 5 is missing
> check_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg"
1 is missing, 2 is missing, 5 is missing