Esiste un modo semplice per echo un file, saltando la prima e lultima riga? Stavo guardando le tubazioni da head a tail, ma per quelli sembra che dovrei conoscere le linee totali dallinizio. Stavo anche cercando split, ma non vedo un modo per farlo neanche con quello.
Risposta
Solo con sed, senza pipe:
sed "1d;$d" file.txt
NOTA
-
1significa prima linea -
dmean delete -
;è il separatore per 2 comandi -
$mean ultima riga
Risposta
Non è necessario conoscere il numero di righe in anticipo. tail e head possono prendere rispettivamente un offset dallinizio o dalla fine del file.
Questo pipe inizia da la seconda riga del file (saltando la prima riga) e si ferma alla penultima (saltando lultima riga). Per saltare più di una riga allinizio o alla fine, modifica i numeri di conseguenza.
tail -n +2 file.txt | head -n -1
viceversa, ovviamente funziona allo stesso modo:
head -n -1 file.txt | tail -n +2
Commenti
Risposta
Ecco come farlo con awk:
awk "NR>2 {print t} {t=$0}"
Anche un altro modo per sed:
sed "1d;x" file.txt
x è il comando sed avanzato, cambia la riga corrente con il precedente: la corrente va nel buffer e prece- dente s va sullo schermo e così via mentre sed elabora lo stream riga per riga (questo è il motivo per cui la prima riga sarà vuota).
awk soluzione su ogni passaggio (riga) inserisce la riga corrente nella variabile e inizia a stamparla solo dopo che la seconda riga è passata. Quindi, abbiamo ottenuto una sequenza di righe di merda sullo schermo dalla penultima allultima ma una. Lultima riga è omessa perché la riga è nella variabile e dovrebbe essere stampata solo nel passaggio successivo, ma tutti i passaggi sono già terminati e non vediamo mai la riga sullo schermo.
Stessa idea nel perl:
perl -ne "print $t if $.>2 ; $t=$_" file.txt
$. sta per numero di riga e $_ per riga corrente.
perl -n è una scorciatoia per while(<..>) {..} struttura e -e è per lo script inline.
Risposta
Per utenti Mac:
Su Mac, head -n -1 non funziona. Invece, inverti il file, taglia la prima riga, quindi invertila indietro:
tail -r file.txt | tail -n +2 | tail -r
Spiegazione:
-
tail -r: inverte lordine delle righe nel suo input -
tail -n +2: stampa tutte le l ines a partire dalla seconda riga nel suo input
Commenti
- Fallirebbe con
head: illegal line count -- -1per essere esatti.
Risposta
In Python vorrei fare così.
#!/usr/bin/python3 import re import sys file = sys.argv[1] with open(file, "r") as f: L = [] for line in f: line = re.sub(r"\n", r"", line) L.append(line) print("\n".join(L[1:-1]))
Incolla il codice precedente in un file e chiamalo script.py. Esegui lo script sul file che desideri controllare.
python3 script.py /path/to/the/file
Esempio:
$ cat file foo apple banana bar $ python3 script.py file apple banana
Commenti
-
''.join(list(open("/path/to/file"))[1:-1]): questa sembra essere una soluzione più semplice 🙂 E se hai bisogno che venga eseguita direttamente dal prompt dei comandi, potresti provare:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1rimuove la prima E lultima riga del mio file.txt, su Ubuntu 14.04.2LTS.head -n -1dice chehead: illegal line count -- -1head -n -1funziona con GNU coreutils, forse MacOS ha qualche variante BSD?