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_STRING
s 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.