gpt4 book ai didi

awk - 正则表达式 "^[[:digit:]]$"在 AWK/GAWK 中没有按预期工作

转载 作者:行者123 更新时间:2023-12-03 23:38:16 26 4
gpt4 key购买 nike

我在 RHEL 上的 GAWK 版本是:

gawk-3.1.5-15.el5

如果它的第一个字段包含所有数字(没有特殊字符,甚至要考虑空格),我想打印一行
Example:

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

Output:
Nothing

Expected Output:
123456789012345,3

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

最佳答案

要匹配 [[:digit:]] 字符类中的多个数字,请添加 + ,这意味着匹配 $1 中的一个或多个数字。

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

这满足您的要求。

一种更惯用的方法(如评论中所建议的那样)是删除 print 并涉及该行的直接匹配并打印它,
echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3

更多的例子证明相同,
echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'

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

do NOT 根据要求产生任何输出。

另一种对数字进行严格长度检查的 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,它支持 native 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]/}" 从行中删除所有数字,并且仅当变量中没有其他字符时条件才变为真。

关于awk - 正则表达式 "^[[:digit:]]$"在 AWK/GAWK 中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41297026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com