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
-
1
significa prima linea -
d
mean 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 -- -1
per 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 -1
rimuove la prima E lultima riga del mio file.txt
, su Ubuntu 14.04.2LTS.head -n -1
dice chehead: illegal line count -- -1
head -n -1
funziona con GNU coreutils, forse MacOS ha qualche variante BSD?