假设我有一行:
终端="123"Pwd="567"
我想使用awk 只选择数字部分
awk 'match($1, /[0-9]+/){print substr($1, RSTART, RLENGTH)};match($2, /[0-9]+/){print
substr($2, RSTART, RLENGTH)}' file
这样可以得到所需的结果。
123 567。
然而,必须有其他更好的方法来选择这两个数字,而无需编写两个匹配语句。
谢谢。
这里有一个很好的awk
:小解决方案
awk '{gsub("[^0-9]+"," "); print}'
只是将所有连续的非数字字符转换为一个空格,所以它在数字序列123
之前留下一个空格。
grep适用于您吗?
kent$ echo 'Terminal="123" Pwd="567"'|grep -o '[0-9]+'
123
567
快速和肮脏的awk:
awk -F'[^0-9]*' '{$1=$1}7'
测试:
kent$ awk -F'[^0-9]*' '{$1=$1}7'<<< 'Terminal="123" Pwd="567"'
123 567
或:
kent$ awk '{gsub(/[^0-9 ]/,"")}7'<<< 'Terminal="123" Pwd="567"'
123 567
这里有另一种使用awk的方法。我们将字段分隔符设置为"
$ echo 'Terminal="123" Pwd="567"' | awk -F" '{print $2, $4}'
123 567
我遇到了一个类似的问题,但我的模式更复杂,所以我不能用gsub
之类的东西来解决我的问题。我写了一个递归函数和一个包装器。它在一个变量中找到多个匹配项,并用空格分隔打印出来:
awk '
function rec_wrap(str)
{
matches=""
return rec_func(str)
}
function rec_func(str2)
{
where=match(str2, /RE/)
if(where!=0) {
matches=(matches substr(str2, RSTART, RLENGTH) " ")
rec_func(substr(str2, RSTART+RLENGTH, length(str2)))
}
return matches
}
{print rec_wrap($1)}
' file.txt
需要包装器rec_wrap
来清空变量matches
。函数match
将最左边匹配的位置和长度写入变量RSTART
和RLENGTH
,并且用substr
提取匹配并将其附加到变量matches
。然后函数rec_func
用字符串str2
的其余部分作为参数来调用自己,直到match
找不到任何匹配项为止。