我有一行像
Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT
我想找到 sig[4] 在该行中的位置。在这种情况下它应该返回7。我想要一些简单的脚本/ bash 中的一个衬垫来做同样的事情。在重复匹配的情况下,如果该行中所有匹配项出现的序列号会很大。
答案1
awk
你可以这样做:
awk '{for(i=1;i<=NF;i++)if($i=="sig[4]")print i}'
即使在多个条目的情况下,这也应该对您有用。
如果需要所有数字都在同一行,可以替换print
为printf
并进行相应调整。
答案2
rush 有一个很好的单行解决方案;这是一个简单的 bash 函数,它打印出字符串中的所有匹配项:
function pratappos() {
target=$1; shift
pos=1
while [[ $# -gt 0 ]]
do
[[ "$1" = "$target" ]] && echo $pos
shift; ((++pos))
done
unset target pos
}
它被概括为搜索给定列表中的任何字符串,因此,例如,您可以设置该函数(在 .bashrc 中或当前 shell 中),然后像这样调用它:
pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT
7
或(两场比赛):
pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT sig[4]
7
11
...传递给它的第一个参数被视为要搜索的字符串,后面是要搜索的字符串的其余部分。它使用 确定参数的位置shift
,这会将给定的字符串视为由 $IFS 分隔。
为了澄清前面的一点:
pratappos 'foo bar' a b foo bar 'foo bar' rest here
5
答案3
您可以使用 来完成此操作perl
,例如使用 List::MoreUtils 模块,如中所述[perl] 获取数组中匹配项的索引
perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
'
使用给定的输入线进行测试
$ perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT"
7
并且一行包含多个实例
$ perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] sig[4] CKT"
7
10