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).
🔴
Iscriviti a:
Commenti sul post (Atom)
Nessun commento:
Posta un commento