cat e lavorare con le wildcardsIn questa lezione impareremo a:
nano;cat;nano
Per creare un file di testo da terminale utilizzeremo nano, un editor semplice e
pensato per essere usato direttamente dalla shell.
Creare o aprire un file:
nano nome_del_file.txt
Se il file non esiste, nano lo crea; se esiste già, lo apre per la modifica.
Salvare e uscire dall’editor:
Ctrl + SCtrl + XProvate voi
Create un file di testo e scrivete un paio di righe:
nano file.txt
Ciao mi chiamo bla bla bla ...
Ctrl + S
Ctrl + X
cat
Il comando cat permette di visualizzare il contenuto di uno o più file di testo.
cat file.txt
Provate voi
Leggete il file che avete appena scritto con nano usando il comando cat.
L’output di cat può essere reindirizzato verso un altro file usando
l’operatore >:
cat prova.txt > nuova_prova.txt
In questo modo il contenuto di prova.txt viene copiato nel file
nuova_prova.txt.
cat permette anche di concatenare più file in uno solo:
nano prova1.txt
nano prova2.txt
cat prova1.txt prova2.txt > concat_prova_1_2.txt
Ora il file concat_prova_1_2.txt contiene la concatenazione di
prova1.txt e prova2.txt.
La shell esegue quella che si chiama wildcard expansion: ogni volta che
incontra il carattere * o altre wildcards, lo sostituisce con la lista dei file o
delle directory che fanno match.
Esempio
ls *
La shell sostituisce * con la lista di tutti i file e le directory nella cartella
corrente. Invece:
ls informatica/*
elenca tutti i file presenti nella directory informatica.
Supponiamo che in informatica ci siano solo tre file:
test1, test2 e results. Il comando precedente è
equivalente a:
ls informatica/test1 informatica/test2 informatica/results
Se scriviamo:
ls informatica/test*
la wildcard test* fa match solo con test1 e test2, quindi è
equivalente a:
ls informatica/test1 informatica/test2
| Wildcard | Fa match con… |
|---|---|
akz |
il testo esatto akz |
* |
una stringa qualunque (anche vuota) |
? |
un carattere qualunque |
[akz] |
un carattere solo tra a, k e z |
[a-z] |
un carattere alfabetico qualunque |
[0-9] |
una cifra qualunque |
[!1b] |
un carattere qualunque che non sia 1 o b |
[!a-e] |
un carattere qualunque che non sia tra a e e |
grep per fare match di
righe di testo dentro i file.
La wildcard:
le rose sono *se
fa match con:
le rose sono rosse
le rose sono costose
le rose sono grosse
ma non con una frase completamente diversa.
Esempio di wildcard più articolata:
test?[a-z][!0-9]
Fa match con tutti i percorsi che iniziano con test, proseguono con un carattere
qualunque, poi con un carattere alfabetico e infine con un carattere non numerico.
cat data/dna-fasta/*.[12]
Qui la wildcard seleziona tutti i file nella directory data/dna-fasta il cui nome
termina con .1 oppure .2. Per esempio:
data/dna-fasta/fasta.1
data/dna-fasta/fasta.2
Dopo la wildcard expansion il comando diventa:
cat data/dna-fasta/fasta.1 data/dna-fasta/fasta.2
Create le seguenti directory e sottodirectory:
datadata/deep1data/deep1/1data/deep2data/deep2/1data/deep3data/deep3/1data/deep4data/deep4/1Stampate a schermo i contenuti della directory data:
ls data
Per stampare i contenuti di tutte le directory dentro data:
ls data/*
Per stampare il contenuto delle sole directory deep0, …, deep4:
ls data/deep*
Per restringere la wildcard alle directory deep0 e deep3:
ls data/deep[03]
Per le directory deep0, …, deep4 ma escludendo deep2:
ls data/deep[!2]
nano.cp.
Potete verificare il risultato leggendo concat.txt con cat e controllando
che contenga il testo di tutti e tre i file originali.