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]