bash - 如何查找字符串中是否缺少一系列非 float

标签 bash

在 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() 代替了 RSsplit 拆分输入字符串并将数字放入数组 n 中。然后检查数组元素,如果是十进制数,则将其放入数组 a

关于bash - 如何查找字符串中是否缺少一系列非 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958579/

相关文章:

C++ 比写入文本文件的 Bash 脚本快得多

bash - 拒绝 sudo 用户访问特定文件夹

linux - 一次获取多个文件的大小

bash - shell 脚本 grep 来 grep 一个字符串

Python 标准输出日志记录 : terminal vs bash file

ruby-on-rails - 在本地设置 Rails 环境变量 (Mac OS X)

python - 从字母组合生成字符串的最佳选择是 python 还是 bash?

sh : 1 file not found error with system() command? 的原因在 StackOverflow 中尝试了可能的解决方案(如下所列)但失败

linux - 初学者的 Bash 脚本 : "Unary Operator Expected" error && how to use grep to search for a variable from the output of a command?

bash - 在 bash 中比较文件中的行