Saltar al contenido

Cuente el número de ocurrencias de una subcadena en un string

Luego de de una prolongada compilación de datos dimos con la respuesta este rompecabezas que suelen tener algunos los usuarios. Te regalamos la respuesta y nuestro deseo es servirte de gran apoyo.

Solución:

Con perl:

printf '%s' "$SUB_STRING" |
  perl -l -0777 -ne '
    BEGIN$sub = 
    @matches = m/Q$subE/g;
    print scalar @matches' <(printf '%s' "$STRING")

Con bash solo, siempre puedes hacer algo como:

s=$STRING//"$SUB_STRING"
echo "$((($#STRING - $#s) / $#SUB_STRING))"

Es decir $s contiene $STRING con todas las ocurrencias de $SUB_STRING dentro de ella eliminado. Descubrimos el número de $SUB_STRINGs que se eliminaron calculando la diferencia en el número de caracteres entre $STRING y $s y dividiendo por la longitud de $SUB_STRING sí mismo.

POSIXly, podrías hacer algo como:

s=$STRING count=0
until
  t=$s#*"$SUB_STRING"
  [ "$t" = "$s" ]
do
  count=$((count + 1))
  s=$t
done
echo "$count"

Utilizando string funciones de procesamiento podríamos hacerlo con Perl de la siguiente manera:

 printf '%sn' "$STRING" |
 perl -nse '
      $_ .= join "", <>;
      $k++ while ++($p = index($_, $s, $p));
      print $k, "n" ;
 '    --     -s="$SUB_STRING" 

Explicación:

° load up the whole string in $_

°  index function will return the position of a substring in a string OTW returns -1

° progressively match the substring and use the position found as the starting position for the next search. 

°  all this while increment the counter $k depicting substring found. 

Algunos otros métodos se enumeran a continuación:

Sorbe el string y usa expresiones regulares.

printf '%sn' "$STRING" |
perl -slp -0777e '
        $_ = () = /$s/g;
 ' -- -s="$s" 

° Sorber string en la variable $_.

° pase la subcadena desde la línea de comando a perl usando la opción -s.

° ahora realice una coincidencia en $_ y en un contexto de lista obtiene las coincidencias que luego se toman en contexto escalar para obtener la cantidad de coincidencias.

° la opción -p imprimirá automáticamente lo que está en $_.

Método usando la herramienta sed:

 esc_s=$(printf '%sn' "$SUB_STRING" |
 sed -e 's:[][/.^$*]:\&:g' -e 'H;1h;$!d;g;s/n/\n/g')

 printf '%sn' "$STRING" |
 sed -ne '
         $!N;s/^/n/;D;
         /'"$esc_s"'/
               x;p;x
               s///;s/^/n/;D
         
 ' | wc -l

° Como paso preparatorio, continuamos y escapamos todos los caracteres que actúan como metacaracteres al lado izquierdo de la declaración s/// en la subcadena que, si no se hace, hará que se bloquee el sed.

° Ahora sorbemos todo string en el espacio del patrón.

° luego seguimos imprimiendo una línea vacía, el espacio de espera es un buen candidato, y quitamos la subcadena del espacio del patrón.

° enjuague... haga espuma... repita mientras haya subcadena presente.

° las líneas vacías se canalizan a la herramienta wc, que nos dará el recuento de líneas = número de veces que se encontró la subcadena.

Esta es la versión de shell:

 e=$STRING  N=0
 while 
     e=$(expr " $e" : " (.*)$SUB_STRING")
     case $e in "" ) break ;; esac
  do
           N=$(expr "$N" + 1)
  done
  echo "$N"

Puedes usar Python como en esta pregunta

python -c 'print "abcdabcva".count("ab")'

O si está trabajando con variables de shell:

python -c 'print("""'"$STRING"'""".count("""'"$SUB_STRING"'"""))'

En tu caso:

python -c 'print """0: asus-wlan: Wireless LAN
                   Soft blocked: no
                   Hard blocked: no
          1: asus-bluetooth: Bluetooth
                   Soft blocked: no
                   Hard blocked: no
          2: phy0: Wireless LAN
                   Soft blocked: no
                   Hard blocked: no
          113: hci0: Bluetooth
                   Soft blocked: no
                   Hard blocked: no""".count("""Bluetooth
                   Soft blocked: no
                   Hard blocked: no""")'

Si haces scroll puedes encontrar las reseñas de otros creadores, tú de igual forma puedes dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *