Encontre a posição da palavra correspondente em uma linha no bash (não na posição do caractere)

2

Eu tenho uma linha como

Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT

e eu quero encontrar a posição de sig [4] na linha. Nesse caso, deve retornar 7 . Eu queria um script simples / um liner no bash para fazer o mesmo. Em caso de correspondência repetida, se o número de série de todas as ocorrências da partida na linha seria ótimo.

    
por Pratap 24.04.2016 / 23:29

3 respostas

3

Você pode fazer isso com awk da seguinte forma:

awk '{for(i=1;i<=NF;i++)if($i=="sig[4]")print i}'

Isso deve funcionar para você mesmo no caso de várias entradas.

Se você precisar de todos os números na mesma linha, poderá substituir print por printf e ajustar adequadamente.

    
por 24.04.2016 / 23:33
1

o rush tem uma boa solução de uma linha ; aqui está uma função bash simples que imprime todas as correspondências na string:

function pratappos() {
  target=$1; shift
  pos=1
  while [[ $# -gt 0 ]]
  do
    [[ "$1" = "$target" ]] && echo $pos
    shift; ((++pos))
  done
  unset target pos
}

Ele é generalizado para procurar por qualquer string em uma determinada lista, portanto, por exemplo, você configuraria essa função (em seu .bashrc ou em seu shell atual) e, em seguida, a chamaria como:

pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT
7

ou (dois jogos):

pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT sig[4]
7
11

... onde o primeiro parâmetro que você passa para ele é tomado como a string que você deseja procurar, seguido pelo resto da string para pesquisar. Ele determina a posição dos argumentos usando shift , que verá sua string dada como separada por $ IFS.

Para esclarecer o ponto anterior:

pratappos 'foo bar' a b foo bar 'foo bar' rest here
5
    
por 28.04.2016 / 18:27
0

Você poderia fazer isso com perl , por exemplo, usando o módulo List :: MoreUtils conforme descrito em [perl] Obter índices de corresponde na matriz

perl -MList::MoreUtils=indexes -alne '
  print $_+1 for indexes { $_ eq "sig[4]" } @F
'

Teste com a linha de entrada fornecida

$ 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

e com uma linha contendo várias instâncias

$ 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
    
por 25.04.2016 / 00:38

Tags