在 Bash 中,
我想在字符串中查找一系列非 float 。
如果我有这样的字符串:
"1.4.jpg 2.005.jpg 003: Blah.jpg Blah4.jpg 4.5.jpg"
而且我想查找数字 firstNum-lastNum 是否丢失。说,如果
firstNum=1
lastNum=5
函数会返回
“少了1个,少了2个,少了5个”
在字符串中查找非 float 相对容易,但让我的脚本感到困惑的是字符串的“2.005.jpg”部分。我的脚本不明白如何识别 5 是 float 2 的一部分,因此应该忽略它。
我只想说数字是否有前导零或有“[0-9]”。在它面前,无视它。但不幸的是,我需要支持带有任意数量前导零的数字。
最佳答案
如果你不反对使用 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) 的所有十进制数,如果数字达到则打印一条消息不是数组 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
。
关于bash - 如何查找字符串中是否缺少一系列非 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958579/