Caputo's blog

Informatica, tecnologia, programmazione, fai da te, papercraft e papertoy

Linux bash ed il testo

Aprile 5th, 2008 by Giovanni Caputo

In Linux esistono moltissime utility per manipolare del testo, con questo post voglio inaugurare una serie di mini guide ai programmi più utilizzati per gestire i nostri file e/o stream di testo.

Text

Iniziamo con la visualizzazione: ci sono modi e modi per visualizzare del testo, e per ogni occasione esiste almeno un programma adatto allo scopo.

less /more /most

questi 3 programmi permettono di scorrere un testo (sia file che stream) riga per riga o pagina per pagina.

  • more: permette di scorrere il testo solo in avanti, riga per riga [premendo Invio] e pagina per pagina [premendo la barra]
  • less: (nome in puro stile *nix) permette di scorrere il testo sia in avanti sia all’indietro [usando le frecce oppure PagUp e PagDown]
  • most: ancora più potente di less, supporta i colori (ad esempio colora le pagine man)

–edit–

pg

questo programma è simile ai 3 di sopra, permette infatti di scorrere file di testo

–edit–

cat

cat permette di concatenare più file, anche non di testo (per esempio per rimontare file suddivisi in più parti con split), però può essere usato anche come semplice visualizzatore di file, ecco alcuni esempi:

cat nomefile //stampa a terminale il contenuto del file

cat nomefile1 nomefile2 //stampa a terminale il contenuto del primo file seguito dal contenuto del secondo

cat nomefile1 nomefile2 > nomefile3 //concatena il contenuto del primo file con il contenuto del secondo e li scrive nel terzo file

head / tail

questi due programmi stampano a terminale rispettivamente l’inizio e la fine del file che viene specificato. Per default stampano solamente 10 righe, per cambiare questo numero basta utilizzare l’opzione -n

vediamo ora come compiere delle ricerche all’interno del testo.

Per questo compito ci basterà un solo programma: grep

Testo

Grep permette di cercare sia in un singolo file (o uno stream), sia in un insieme di file che possono essere elencati in coda al comando. È possibile anche ricercare all’interno di tutti i file presenti in una directory (basta specificare il percorso con *).

Inoltre, grep supporta sia la ricerca di stringhe costanti, sia la ricerca di pattern di stringhe (tramite l’uso di espressioni regolari).

Vediamo un po’ di esempi:

grep ‘parole da cercare’ nomefile1 nomefile2 //cerca ‘parole da cercare’ nei 2 file e stampa a video le righe che le contengono

grep -n -i ‘paRoLe dA cerCAre’ /home/user/books/* //cerca ‘parole da cercare’ ignorando se si tratta di maiuscole o minuscole (-i) in tutti i file contenuti in /home/user/books, e stampa “nomefile:numero di riga:riga”

grep [a-z] nomefile //cerca (e stampa) tutte le righe che contengono almeno una lettera minuscola ([a-z] è un esempio di espressione regolare)

per le espressioni regolari vi consiglio di sfogliare le pagine man di grep, sono troppo variegate per poterle descrivere in un post (magari ne parlerò in futuro).

Altre 2 opzioni che potrebbero servirvi sono:

  • -l che elenca solamente il nome dei file che contengono la stringa di testo da ricercare (questa opzione può essere utile se si cerca in tutti i file di una directory con*)
  • -w restringe la ricerca solamente alle parole intere

Dopo aver visto come visualizzare i nostri testi e come compiere ricerche su di essi, vediamo come effettuare delle sostituzioni in maniera “semplice” e veloce.

Il comando che tratterò è: sed

Sed è uno stream editor dalle 1000 + 1 funzionalità, oggi mi concentrerò solo sulle trasformazioni del testo. Sed è utilissimo se dovete effettuare tante sostituzioni all’interno di un file molto grosso (quando dico molto intendo proprio MOOOLTO, io l’ho usato con file di testo da 500MB).

Vediamo come funziona:

Innanzitutto il comando per effettuare delle ricerche con sostituzioni è in questa forma:

sed ’s/before/after/’ < in > out

  • s: sta per “sostituisci”
  • before: è la stringa da ricercare
  • after: è la stringa da inserire al posto della stringa originale
  • < in: indica il file di input (”<” indica che il file verrà preso in input da sed)
  • > out: indica il file di output (”>” indica che il file verrà utilizzato come output), se manca verrà scritto tutto a terminale
  • /: è un carattere utilizzato come separatore (si può utilizzare il carattere che si preferisce, basta che non compaia nelle stringhe before e after; se il carattere separatore appare anche nelle stringhe basta precederlo da “\”)

primo esempio:

sed ’s/sole/luna/’ < in > out //tutte le volte che in “in” compare “sole” in “out” verrà scritto “luna”

le stringhe before e after possono essere più “furbe”, includendo espressioni regolari:

sed ’s:[0-9]*:NUMERO:’ < in > out //tutti i numeri sono sostituiti da “NUMERO” (invece di / ho usato : come carattere separatore)

si può usare il carattere & per ricopiare la stringa trovata:

sed ’s/[0-9]*/aaa&zzz/’ < in > out //ogni numero viene inserito all’interno di aaa e zzz

si possono memorizzare 9 parti distinte delle stringhe trovate per poterle utilizzare nella sostituzione:

sed ’s/\([0-9]*\).[0-9]*/\1/’ < in > out //utilizzando “\(” e “\)” nella stringa da trovare si possono identificare le diverse parti, che poi possono essere utilizzate nella sostituzione indicandole con “\n” (dove “n” è sostituita da una cifra da 1 a 9) [nell’esempio viene ricopiata solo la parte intera dei numeri decimali]

Il grande vantaggio di sed è che analizza il testo come uno stream, quindi non necessita di aprire tutto il file prima di iniziare l’elaborazione, quindi risulta particolarmente veloce con file grossi (provate ad aprire con un editor normale questo file dopo averlo decompresso).

Per qualche info in più ecco una introduzione (in inglese) a sed.

Fonte: doppiavu

Questo post è stato postato sabato, Aprile 5th, 2008 at 09:18 nella categoria tutorial. Tags:, , .
Puoi seguire tutti i commenti di questo articolo attraverso RSS 2.0 feed. Puoi lasciare un commento, o trackback dal nostro sito.

Lascia un commento

You must be loggati to post a comment.