有多个相关问题,似乎它们不能用来awk
解决问题。
echo "blah foo123bar234blah" | egrep -o '([0-9]+)'
Run Code Online (Sandbox Code Playgroud)
回报
123
234
Run Code Online (Sandbox Code Playgroud)
但
echo "blah foo123bar234blah" |
awk '{ match($0,/([0-9]+)/,m); print m[0], m[1],m[2]}'
Run Code Online (Sandbox Code Playgroud)
返回123 123
和
echo "blah foo123bar234blah" |
awk '{ match($0,/([0-9]+).+([0-9]+)/,m); print m[0], m[1],m[2]}'
Run Code Online (Sandbox Code Playgroud)
回报 123bar234 123 4
在手册中,在match(string, regexp [, array])部分中,示例是:
echo foooobazbarrrrr |
gawk '{ match($0, /(fo+).+(bar*)/, arr); print arr[1], arr[2]}'
Run Code Online (Sandbox Code Playgroud)
返回foooo barrrrr
.
那么如何使用 awk (相当于grep -o
)从字符串中提取多个数字?
使用用于多字符 RS 和 RT 的 GNU awk:
$ echo "blah foo123bar234blah" |
awk -v RS='[0-9]+' '$0=RT'
123
234
Run Code Online (Sandbox Code Playgroud)
使用任何 awk(并保留原始正则表达式而不是否定它,因为只有使用简单的括号表达式才容易,而不是强大的通用方法):
$ echo "blah foo123bar234blah" |
awk -v FS='\n' '{gsub(/[0-9]+/,FS"&"FS); for (i=2;i<=NF;i+=2) print $i}'
123
234
Run Code Online (Sandbox Code Playgroud)
或者:
$ echo "blah foo123bar234blah" |
awk '{ while (match($0,/[0-9]+/) ) {print substr($0,RSTART,RLENGTH); $0=substr($0,RSTART+RLENGTH)} }'
123
234
Run Code Online (Sandbox Code Playgroud)