在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]”。在它前面,忽略它。但不幸的是,我需要支持任意数量的前导零的数字。
答案 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