私は次の表現を知っています。
echo "bob alice robert alice" | awk '{print index($0,"alice")}'
5
最初のアリスと一致するインデックスが出力されます。一致するすべてのインデックスを取得する方法はありますか? 、例えば:
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 " "
}'