Encontrar la position de la palabra coincidente en una línea en bash (no en la position del personaje)

Tengo una línea como

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

y quiero encontrar la position de sig [4] en la línea. En este caso, debería devolver 7 . Quería un script / un trazador de líneas simple en bash para hacer lo mismo. En caso de coincidencia repetida, si el número de serie de todas las ocurrencias de la coincidencia en la línea sería excelente.

Puedes hacerlo con awk así:

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

Eso debería funcionar para usted incluso en el caso de inputs múltiples.

Si necesita todos los numbers en la misma línea, puede replace la print con printf y ajustar en consecuencia.

Puede hacerlo con perl , por ejemplo, utilizando el module List :: MoreUtils como se describe en [perl] Obtenga índices de coincidencias en matriz

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

Prueba con la línea de input dada

 $ 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 

y con una línea que contiene varias instancias

 $ 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 

rush tiene una buena solución de una sola línea ; aquí hay una function bash simple que imprime todas las coincidencias en la cadena:

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

Se generaliza para search cualquier cadena en una list determinada, por lo que, por ejemplo, configuraría esa function (en su .bashrc, o en su caparazón actual), luego llámela como:

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

o (dos partidos):

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

… donde el primer parámetro que pasas se toma como la cadena que deseas search, seguido por el rest de la cadena para search. Determina la position de los arguments usando shift , que verá tu cadena dada como separado por $ IFS.

Para aclarar el punto anterior:

 pratappos 'foo bar' ab foo bar 'foo bar' rest here 5