我知道下面的表达:
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 " "
}'