如何在awk中获取同一行中多个匹配的索引值?

如何在awk中获取同一行中多个匹配的索引值?

我知道下面的表达:

echo "bob alice robert alice" | awk '{print index($0,"alice")}'
5

将输出第一个 alice 匹配的索引,有没有办法获取所有匹配的索引?,例如:

echo "bob alice robert alice" | awk 'unknown magic'
5:18

答案1

带有 POSIX 工具箱:

echo "bob alice robert alice"| p=alice awk '
{
  while(1) {
    $0 = substr($0, RSTART+RLENGTH)
    match($0, ENVIRON["p"])
    if (RSTART == 0) break
    i = i ? i+RSTART+RLENGTH-1 : RSTART
    print i
  }
}' | paste -sd: -
5:18

答案2

这应该可以完成你的工作:

echo "bob alice robert alice" |\
awk '{
    s=$0
    o=0
    m="alice"
    l=length(m)
    i=index(s,m)
    while (i>0) {
        o+=i
        print o
        s=substr(s,i+l)
        o+=l-1
        i=index(s,m)
    }
}'

要使用“:”(冒号)进行格式化,您可以通过管道传输

paste -s |tr '\t' ':'

答案3

echo "bob alice robert alice"| awk '
{for( i=1;i<=NF;i++) {
    if ( $i == "alice") {
          printf index($0,"alice") ":"
          gsub("alice","xxxxx",$i)
     }
}
print " "
}'

相关内容