正则表达式“^[[: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:]]+,'
我在 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:]]+,'