正则表达式“^[[:digit:]]$”在 AWK/GAWK 中未按预期工作

Regex "^[[:digit:]]$" not working as expected in AWK/GAWK

我在 RHEL 上的 GAWK 版本是:

gawk-3.1.5-15.el5

我想打印一行,如果它的第一个字段全是数字(没有特殊字符,甚至 space 也要考虑)

Example:

echo "123456789012345,3" | awk -F, '{if ( ~ /^[[:digit:]]$/)  print [=12=]}'

Output:
Nothing

Expected Output:
123456789012345,3

这里出了什么问题?我的 AWK 版本不理解 GNU 字符 类 吗?请帮助

要匹配[[:digit:]]字符class中的多个数字,加一个+,表示匹配</code>.[=33中的一个或多个数字=] <pre><code>echo "123456789012345,3" | awk -F, '{if ( ~ /^([[:digit:]]+)$/) print [=10=]}' 123456789012345,3

满足您的要求。

一种更惯用的方法(如评论中所建议的那样)是删除 print 并在行中包含直接匹配并打印它,

echo "123456789012345,3" | awk -F, ' ~ /^([[:digit:]]+)$/'
123456789012345,3

更多的例子也证明了同样的道理,

echo "a1,3" | awk -F, ' ~ /^([[:digit:]]+)$/'

(和)

echo "aa,3" | awk -F, ' ~ /^([[:digit:]]+)$/'

根据要求产生任何输出。

另一种 POSIX 对数字进行严格长度检查的兼容方法可以通过如下方式实现,其中 {3} 表示匹配长度。

echo "123,3" |  awk --posix -F, ' ~ /^[0-9]{3}$/'
123,3

(和)

echo "12,3" |  awk --posix -F, ' ~ /^[0-9]{3}$/'

不产生任何输出。

如果您使用的是 bash shell 的相对较新版本,它支持使用 POSIX 字符 ~ 的本机 regEx 运算符 class如上,类似

#!/bin/bash

while IFS=',' read -r row1 row2
do
   [[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

对于输入文件说 file

$ cat file
122,12
a1,22
aa,12

脚本生成,

$ bash script.sh
122,12

虽然这可行,但 bash regEx 可能会更慢,使用字符串操作的相对直接的方法类似于

while IFS=',' read -r row1 row2
do
   [[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

"${row1//[0-9]/}" 删除行中的所有数字,只有当变量中没有其他字符时,条件才为真。

能否请您尝试关注并告诉我是否有帮助。

echo "123456789012345,3" | awk -F, '{if ( ~ /^([[:digit:]]*)$/)  print [=10=]}'

编辑: 上面的代码也可以简化为如下。

echo "123456789012345,3" | awk -F, '( ~ /^[[:digit:]]*$/)'

此处您将打印与模式匹配的每一行。这正是 grep 的目的。由于@Inian 出色地告诉您您的代码出了什么问题,让我提出一个基于 grep 的替代答案,它与 awk 命令完全相同(尽管快得多):

grep -E '^[[:digit:]]+,'