要匹配[[:digit:]] 字符类中的多个数字,请添加+,这意味着匹配$1 中的一个或多个数字。
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/) print $0}'
123456789012345,3
满足您的要求。
一种更惯用的方法(如 cmets 建议的那样)是删除 print 并在行上直接匹配并打印它,
echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3
更多的例子证明了这一点,
echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
(和)
echo "aa,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
不根据要求产生任何输出。
另一种符合POSIX 的方法可以对数字进行严格的长度检查,如下所示,其中{3} 表示匹配长度。
echo "123,3" | awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3
(和)
echo "12,3" | awk --posix -F, '$1 ~ /^[0-9]{3}$/'
不产生任何输出。
如果您使用的是相对较新版本的bash shell,它支持原生regEx 运算符和~ 使用上述POSIX 字符类,类似于
#!/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]/}" 从行中删除所有数字,并且仅当变量中没有其他字符时条件才成立。