Successivo: , Precedente: , Su: Esempi   [Contenuti][Indice]


4.7 Numerare le righe

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

Successivo: , Precedente: , Su: Esempi   [Contenuti][Indice]