Questo script rimpiazza ‘cat -n’; infatti formatta il suo output
esattamente come farebbe GNU cat
.
Naturalmente è completamente inutile per due motivi: primo, perché qualcun altro ha scritto un programma C proprio per questo; secondo, perché si potrebbe usare il seguente script di Bourne-shell per lo stesso scopo e sarebbe molto più veloce:
#! /bin/sh sed -e "=" $@ | sed -e ' s/^/ / N s/^ *\(......\)\n/\1 / '
Lo script appena visto usa sed
per stampare il numero di riga,
quindi raggruppa le righe a due a due usando N
. Naturalmente,
questo script non è istruttivo quanto quello presentato qua sotto.
L’algoritmo usato per incrementare usa entrambi i buffer, cosicché la riga
è stampata il più presto possibile e poi buttata via. Il numero
viene diviso in modo che le cifre che cambiano vanno in un buffer e quelle
invariate in un altro; le cifre cambiate sono modificate in un solo
passaggio (usando un comando y
). Il numero della riga successiva
è poi formato e immagazzinato nell’hold space, per essere usato nella
successiva iterazione.
#!/usr/bin/sed -nf
# Innesca l'operazione sulla prima riga x /^$/ s/^.*$/1/
# Aggiunge il corretto numero di riga prima del modello G h
# Formatta e stampa s/^/ / s/^ *\(......\)\n/\1 /p
# Prende il numero di riga dall'hold space; aggiunge uno zero # se si deve aggiungere una cifra alla riga successiva g s/\n.*$// /^9*$/ s/^/0/
# separa le cifre che cambiano da quelle invariate con una x s/.9*$/x&/
# mantiene le cifre che cambiano nell'hold space h s/^.*x// y/0123456789/1234567890/ x
# mantiene le cifre invariate nel pattern space s/x.*$//
# forma un nuovo numero, rimuove il newline implicitamente aggiunto da G G s/\n// h