有多个相关的问题,似乎它们不能awk
用来解决问题。
echo "blah foo123bar234blah" | egrep -o '([0-9]+)'
返回
123
234
但
echo "blah foo123bar234blah" |
awk '{ match($0,/([0-9]+)/,m); print m[0], m[1],m[2]}'
返回123 123
和
echo "blah foo123bar234blah" |
awk '{ match($0,/([0-9]+).+([0-9]+)/,m); print m[0], m[1],m[2]}'
返回 123bar234 123 4
在手册中的部分:match(string, regexp [, array])中,示例为:
echo foooobazbarrrrr |
gawk '{ match($0, /(fo+).+(bar*)/, arr); print arr[1], arr[2]}'
哪个返回foooo barrrrr
。
那么如何使用 awk(相当于grep -o
)从字符串中提取多个数字?
使用 GNU awk 进行多字符 RS 和 RT:
使用任何 awk (并保留原始正则表达式而不是否定它,因为这很容易使用简单的括号表达式而不是强大的通用方法):
或者:
该
match()
函数执行正则表达式的单个匹配。match()
要在 GNU中使用与 with 匹配的正则表达式查找每个数字awk
,您必须循环。我们只对
a[0]
这里感兴趣,因为我们不在正则表达式中使用括号。我们不在表达式中使用括号,因为我们不需要它们。如果我们想用单个表达式(例如([0-9]+)[^0-9]+([0-9]+)
等)匹配已知数量的整数,我们可能需要括号,但是在这个练习中,我们真的不知道可能有多少个整数。或者,使用标准
awk
,这匹配字符串中连续数字的运行
str
。对于每个匹配,匹配的字符串都会被打印出来,并且str
不再感兴趣的部分会被删除substr()
。测试:
您可以使用
gsub()
函数awk
并将每次出现的“不包含数字的子字符串”转换为单个空格,然后使用该split()
函数在空格处拆分结果字符串。这就像默认FS
变量上的字段拆分一样,并丢弃前导和尾随“空字段”:因此,对于您的示例:
要提取英文
0-9
数字,请使用 GNU awk 进行 FPAT:或使用任何 awk:
或者专门使用 match() 函数(顺便说一句,没有好处,因为我们知道我们只过滤掉 中的数字
[^0-9]+
,所以其他一切都只是数字,但是是的,为了避免打印空字段,它很有用,但没有比$i+0==$i
上面的更好):如果您真的只想提取数字(以下示例中的自然数和零!),您可以将其他任何内容定义为字段分隔符:
(添加了一些格式,因此它为每条记录返回以空格分隔的条目)
还有另一个使用 GNU
awk
的选项patsplit()
:为什么要使用所有 FPAT 和 patsplit 以及 while(match()) 让它变得如此复杂 -
就足够了: