unix正则表达式仅限数字(允许的时间段)

时间:2013-11-22 08:27:26

标签: regex awk

我试图通过检查列是否为数字来使用awk清理我的tsv文件。我已经尝试了几个正则表达式匹配,但没有一个完全符合我的要求:

12 - >是

12.01 - >是的

12m13d - >没有

strange - >无

"strange" - >无

strange7 - >无

我试过了:

head  -1 file.tsv | awk -F"\t" '{
    if($6 ~ /^\d+$/)
        print;
    else;

}'

false返回5.6;

我也尝试过:

head  -1 file.tsv | awk -F"\t" '{
    if(7a ~ /^-*[0-9,\.]+$/)
        printf "yes"
    else printf "no"

}'

但这会为“7a”返回true(我希望它返回false

3 个答案:

答案 0 :(得分:3)

在正则表达式中使用字符类:

^[\d.]+$

虽然这会传递你的所有例子,但如果你想更严格,请使用:

^\d+(\.\d+)?$

将句号数量限制为一个。

答案 1 :(得分:2)

我会说你波西米亚人的第二个正则表达是完美的(这是我用于十进制数匹配)。如果您想要匹配.5以及您应该使用的所有示例,那么:

^\d*\.?\d+$

Working on RegexPal

答案 2 :(得分:1)

您是否考虑过对其进行算术运算以查看其是否与数字相似,例如:添加0然后比较以查看结果是否等于原始结果:

$ cat file
12 -> yes
12.01 -> yes
12m13d -> no
strange -> no
"strange" -> no
strange7 -> no

$ awk '{print $0 " => " ($1==$1+0 ? "yes" : "no")}' file
12 -> yes => yes
12.01 -> yes => yes
12m13d -> no => no
strange -> no => no
"strange" -> no => no
strange7 -> no => no