在巴斯,
我想在一个字符串中找到一个范围的非浮点数。
如果我有这样的绳子:
"1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg 4.5.jpg"我想知道数字是否丢失了。说,如果
firstNum=1
lastNum=5函数将返回
1人失踪,2人失踪,5人失踪
在字符串中查找非浮点数相对容易,但让我的脚本困惑的是字符串的"2.005.jpg“部分。我的脚本不知道如何识别5是浮点数2的一部分,因此应该忽略它。
我只想说这个数字是有前导零还是有“0-9”。在它面前,忽略它。但不幸的是,我需要支持的数字与任何数量的领先零。
发布于 2018-08-22 06:55:28
如果不反对使用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脚本,它依赖于记录分隔符RS将行拆分为仅(浮点数)。
诀窍是将0添加到找到的数字中,并检查它是否仍然是十进制形式(没有任何点.)。如果是这样,则将该数字存储在数组a中。
END语句循环遍历从min (1)到max (5)的所有十进制数,如果该数字不是数组a的一部分,则打印消息。
符合posix标准的替代脚本如下:
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中。然后在十进制数情况下,检查数组元素并将其放入数组a中。
发布于 2018-08-22 03:36:23
可能的答案:
下面是一个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发布于 2018-08-22 09:05:43
看看这个扩展全球模式
find_missing() {
shopt -s extglob
for(( i = $2; i <= $3; i++ )); do
[[ $1 = !(*[0-9]|*[0-9].)*(0)"$i"!(.[0-9]*|[0-9]*) ]] || printf '<%s> missing!\n' "$i"
done
}假设$i为4:
"$i":匹配数字"$i"!(.[0-9]*|[0-9]*):如果数字后面没有.<number>,这将使其成为浮点数(例如,4.1),则匹配该数字,或者简单地后面跟着另一个数字,使其成为不同的数字(例如,它会错误地认为41是4 )。*(0)"$i"!(.[0-9]*|[0-9]*):允许引导0!(*[0-9]|*[0-9].)*(0)"$i"!(.[0-9]*|[0-9]*):如果数字不以<number>.为前缀,则匹配它,这会使它成为浮点数(例如,1.4),或者以另一个数字作为前缀,使其成为不同的数字(例如,它会错误地认为24是4 )。shopt -s extglob:启用扩展球状测试运行:
$ find_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" 1 5
<1> missing!
<2> missing!
<5> missing!
$ find_missing "1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg" 1 2
<1> missing!
<2> missing!
$ find_missing "001 3.002 A.4A" 1 4
<2> missing!
<3> missing!https://stackoverflow.com/questions/51958579
复制相似问题