在 bash 中查找一行中匹配单词的位置(不是字符的位置)

在 bash 中查找一行中匹配单词的位置(不是字符的位置)

我有一行像

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}'

即使在多个条目的情况下,这也应该对您有用。

如果需要所有数字都在同一行,可以替换printprintf并进行相应调整。

答案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

相关内容