26 novembre, 2019

Bash scripts - cose che devo ricordarmi - 4


Ci sono cose che è bene ricordarsi per quando vengono a taglio (si capisce o è dialettale?), oggi continuo da qui.

La gestione delle stringhe

Sì, si può fare anche con Bash ma ci sono alcune particolarità come raccontate qui. Roba che provo a riassumere per vedere se ho capito.

Raccolgo le funzioni che mi sembra possano servire in un unico file st_def, questo:

# funzioni per la gestione delle stringhe

# st_len = lunghezza
#   st_len st (anche con spazi)         
function st_len {
    s="$*"
    echo ${#s}
}

# st_before = stringa prima di parole
#   st_before st w
function st_before {
    s="$1"
    w="$2"
    echo -n ${s%%$w*}
}

#
st_after = stringa dopo di parole
#   st_after st w

function st_after {
    s="$1"
    w="$2"
    echo -n ${s#*$w}
}


# st_index = posizione di parole nella stringa
#            per congruenza con st_len parte da 1
#   st_index st w
 

function st_index {
    s="$1"
    w="$2"
    s=${s%%$w*}
    echo $(( ${#s} + 1 ))
}


# st_insert = (st-base, sr-da ins, pos)
#             inserisce parole alla posizione pos
#             per congruenza con st_len parte da 1
#   st_insert st w pos

function st_insert {
    s="$1"
    w="$2"
    p=$3
    echo ${s:0:p}$w${s:p}
}

# st_subst = estrae p caratteri da inizio parola
#   st_subst st w p

function st_subst {
    s="$1"
    w="$2"
    p=$3
    t=${s%%$w*}
    #echo $s '-' $w '-' $t
    i=$(( ${#t} + 1 ))
    r=${s:$i-1:$p}
    echo $r
}

# st_zap = cancella zap nella stringa
#   st_zap st w

function st_zapst {
    s="$1"
    w="$2"
    p=$3
    t=${s%%$w*}
    i=${#t}   
    q=$(( i + p  ))
    r=${s:0:$i}${s:$q}
    echo $r
}


OK, posso passare ai test delle funzioni, nell'ordine con cui compaiono nella libreria (si può chiamare libreria? io intanto lo faccio).

Lunghezza della stringa (t-len):

#!/bin/bash

. st_def

echo $*
L=$(st_len "$*")
echo 'L='$L

test:

$ bash t-len 1234 6789 abcd f
1234 6789 abcd f
L=16

$


Parte della stringa fino a una (o più parole) (t-before):

#!/bin/bash

. st_def

t='inizio _p oi_ fine'
w=' _p oi'
echo $t
echo $w
res=$(st_before "$t" "$w")
echo '*'$res'*'

test:

$ bash t-before
inizio _p oi_ fine
_p oi
*inizio*
$


Parte della stringa dopo a una (o più parole) (t-after):

#!/bin/bash

. st_def

t='inizio _p oi_ fine'
w=' _p oi_ '
echo $t
echo $w
res=$(st_after "$t" "$w")
echo '*'$res'*'


test:

$ bash t-after
inizio _p oi_ fine
_p oi_
*fine*
$


Posizione di una parola all'interno di una stringa (t-index):

#!/bin/bash

. st_def

t='1234 6789 abcd'
w=' 6'
echo $t '--' $w
p=$(st_index "$t" "$w")
echo $p
w=' a'
echo $t '--' $w
p=$(st_index "$t" "$w")
echo $p
w='manca'
echo $t '--' $w
p=$(st_index "$t" "$w")
echo $p


test:

$ bash t-index
1234 6789 abcd -- 6
5
1234 6789 abcd -- a
10
1234 6789 abcd -- manca
15
$


Nota: se la parola cercata manca la funzione restituisce la lunghezza della stringa (bug?); forse sarebbe meglio se restituisse 0 o -1.

Insetimento di stringa alla posizione data (t-insert):

#!/bin/bash

. st_def

st='1234567890abcdef'
w=' _ otto _ '
p=8
echo $st
res=$(st_insert "$st" "$w" $p)
echo $res


test:

$ bash t-insert
1234567890abcdef
12345678 _ otto _ 90abcdef
$


Estrarre la sub-stringa lunga n caratteri dalla stringa (t-subst):

#!/bin/bash

. st_def

st='579 1234567890abcdef'
w='78'
p=4
echo $st
res=$(st_subst "$st" "$w" $p)
echo $res


test:

$ bash t-subst
579 1234567890abcdef
7890
$


Cancellare parte di una stringa (t-zap):

#!/bin/bash

. st_def

st='1234567890abcdef'
w='78'
p=4
echo $st
res=$(st_zapst "$st" "$w" $p)
echo $res


test:

$ bash t-zap
1234567890abcdef
123456abcdef
$


OK. Serve? forse, forse invece è solo per vedere che si può fare, educational. Ricordando che c'è sempre Python (e tanti altri linguaggi).
🔴

Nessun commento:

Posta un commento