[英]awk extract multiple groups from each line
當模式在一行中多次匹配時,如何對所有匹配的組執行操作?
為了說明,我想搜索/Hello! (\\d+)/
/Hello! (\\d+)/
並使用數字,例如,打印出來或將它們相加,以便輸入
abcHello! 200 300 Hello! Hello! 400z3
ads
Hello! 0
如果我決定將它們打印出來,我會期待它的輸出
200
400
0
這是一個簡單的語法,每個awk(nawk,mawk,gawk等)都可以使用它。
{
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.