当模式在一条线上多次匹配如何执行对所有匹配组的行动?
为了说明这一点,我想搜索/Hello! (\d+)/
/Hello! (\d+)/
并使用数字,例如,将它们打印出来或它们求和,所以对于输入
abcHello! 200 300 Hello! Hello! 400z3
ads
Hello! 0
如果我决定要打印出来,我期望的输出
200
400
0
当模式在一条线上多次匹配如何执行对所有匹配组的行动?
为了说明这一点,我想搜索/Hello! (\d+)/
/Hello! (\d+)/
并使用数字,例如,将它们打印出来或它们求和,所以对于输入
abcHello! 200 300 Hello! Hello! 400z3
ads
Hello! 0
如果我决定要打印出来,我期望的输出
200
400
0
这是一个简单的语法,每一个的awk(NAWK,mawk,呆子,等等)可以用这个。
{
while (match($0, /Hello! [0-9]+/)) {
pattern = substr($0, RSTART, RLENGTH);
sub(/Hello! /, "", pattern);
print pattern;
$0 = substr($0, RSTART + RLENGTH);
}
}
这是gawk
句法。 这也适用于模式时,有没有这可以作为一个记录分隔符和不匹配了换行符固定文本:
{
pattern = "([a-g]+|[h-z]+)"
while (match($0, pattern, arr))
{
val = arr[1]
print val
sub(pattern, "")
}
}
GNU AWK
awk 'BEGIN{ RS="Hello! ";}
{
gsub(/[^0-9].*/,"",$1)
if ($1 != ""){
print $1
}
}' file
没有GAWK功能多次匹配相同的模式在一条线上。 除非你知道确切的图案多少次重复。
有了这个,你必须遍历“手动”在同一行中的所有比赛。 对于示例输入,这将是:
{
from = 0
pos = match( $0, /Hello! ([0-9]+)/, val )
while( 0 < pos )
{
print val[1]
from += pos + val[0, "length"]
pos = match( substr( $0, from ), /Hello! ([0-9]+)/, val )
}
}
如果该模式应换行匹配了过来,必须修改输入记录分隔符 - RS