Successivo: Stampare le variabili di ambiente bash, Precedente: Incrementare un numero, Su: Esempi [Contenuti][Indice]
Questo è un uso di sed alquanto strano. Si trasforma il testo,
e lo si trasforma in modo che diventi un comando di shell, che poi si dà in
pasto alla shell.
Niente paura, con sed si è fatto anche di peggio; ho
visto uno script che converte l’output di date in un
programma bc!
La parte principale di questo è lo script sed, che rimappa il
nome da minuscolo a maiuscolo (o viceversa) e controlla anche
se il nome rimappato è lo stesso di quello originale.
Si noti come lo script è parametrizzato usando variabili di shell
e le opportune quotature.
#! /bin/sh # rinomina file in minuscolo/maiuscolo... # # uso: # move-to-lower * # move-to-upper * # o # move-to-lower -R . # move-to-upper -R . #
help()
{
cat << eof
Uso: $0 [-n] [-r] [-h] file...
-n non esegue azioni, mostra solo ciò che verrebbe fatto -R ricorsivo (usa find) -h questo messaggio files i file da rimappare in minuscolo
Esempi:
$0 -n * (vede se tutto è a posto, quindi...)
$0 *
$0 -R .
eof }
apply_cmd='sh' finder='echo "$@" | tr " " "\n"' files_only=
while :
do
case "$1" in
-n) apply_cmd='cat' ;;
-R) finder='find "$@" -type f';;
-h) help ; exit 1 ;;
*) break ;;
esac
shift
done
if [ -z "$1" ]; then
echo Usage: $0 [-h] [-n] [-r] files...
exit 1
fi
LOWER='abcdefghijklmnopqrstuvwxyz' UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
case `basename $0` in
*upper*) TO=$UPPER; FROM=$LOWER ;;
*) FROM=$UPPER; TO=$LOWER ;;
esac
eval $finder | sed -n '
# rimuove tutte le barre oblique iniziali s/\/*$//
# aggiunge ./ se non ci sono percorsi, ma solo un nome di file /\//! s/^/.\//
# salva percorso+nome_file h
# rimuove il percorso s/.*\///
# fa la conversione solo sul nome di file y/'$FROM'/'$TO'/
# ora la riga contiene il percorso+file originale, mentre # l'hold space contiene il nuovo nome di file x
# aggiunge il nome di file convertito alla riga, che ora contiene # percorso/nome-file\nome-file-convertito G
# controlla se il nome di file convertito è uguale all'originale, # se così è, non stampa niente /^.*\/\(.*\)\n\1/b
# protegge i caratteri speciali per la shell s/["$`\\]/\\&/g
# ora, trasforma percorso/da-file\n, in # mv percorso/da-file percorso/a-file e lo stampa s/^\(.*\/\)\(.*\)\n\(.*\)$/mv "\1\2" "\1\3"/p
' | $apply_cmd
Successivo: Stampare le variabili di ambiente bash, Precedente: Incrementare un numero, Su: Esempi [Contenuti][Indice]