Existe-t-il un moyen simple de faire écho à un fichier en sautant la première et la dernière ligne? Je regardais la tuyauterie de head
vers tail
, mais pour ceux-là, il semble que je devrais connaître le nombre total de lignes dès le départ. Je regardais aussi split
, mais je ne vois pas non plus de moyen de le faire avec ça.
Réponse
Juste avec sed
, sans aucun tuyau:
sed "1d;$d" file.txt
REMARQUE
-
1
signifie premier ligne -
d
signifie delete -
;
est le séparateur de 2 commandes -
$
signifie dernière ligne
Réponse
Vous navez pas besoin de connaître le nombre de lignes à lavance. tail
et head
peuvent prendre respectivement un décalage depuis le début ou la fin du fichier.
Ce tube commence à la deuxième ligne du fichier (sautant la première ligne) et sarrête à la dernière mais une (sautant la dernière ligne). Pour ignorer plus dune ligne au début ou à la fin, ajustez les nombres en conséquence.
tail -n +2 file.txt | head -n -1
linverse fonctionne de la même manière, bien sûr:
head -n -1 file.txt | tail -n +2
Commentaires
Réponse
Voici comment le faire avec awk
:
awk "NR>2 {print t} {t=$0}"
Autre moyen également pour sed
:
sed "1d;x" file.txt
x
est une commande avancée sed
, elle change la ligne actuelle avec le précédent: le courant passe dans le buffer et previou s va à lécran et ainsi de suite pendant que sed
traite le flux ligne par ligne (cest pourquoi la première ligne sera vide).
à chaque étape (ligne) met la ligne courante dans la variable et ne commence à limprimer quaprès le passage de la deuxième ligne. Ainsi, nous avons eu une séquence de lignes shitfed sur lécran de la seconde à la dernière. La dernière ligne est omise car la ligne est dans la variable et ne devrait être imprimée quà létape suivante, mais toutes les étapes sont déjà terminées et nous ne voyons jamais la ligne à lécran.
Même idée dans le perl
:
perl -ne "print $t if $.>2 ; $t=$_" file.txt
$.
représente le numéro de ligne et $_
la ligne actuelle.
perl -n
est le raccourci pour while(<..>) {..}
structure et -e
est pour le script en ligne.
Réponse
Pour les utilisateurs Mac:
Sur Mac, head -n -1
ne fonctionne pas. À la place, inversez le fichier, coupez la première ligne, puis inversez-la:
tail -r file.txt | tail -n +2 | tail -r
Explication:
-
tail -r
: inverse lordre des lignes dans son entrée -
tail -n +2
: imprime tous les l ines à partir de la deuxième ligne de son entrée
Commentaires
- Cela échouerait avec
head: illegal line count -- -1
pour être exact.
Réponse
En python, je ferais comme ça.
#!/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]))
Collez le code ci-dessus dans un fichier et nommez-le script.py
. Exécutez le script sur le fichier avec lequel vous souhaitez vérifier.
python3 script.py /path/to/the/file
Exemple:
$ cat file foo apple banana bar $ python3 script.py file apple banana
Commentaires
-
''.join(list(open("/path/to/file"))[1:-1])
: Cela semble être une solution plus simple 🙂 Et si vous avez besoin que cela soit fait directement sur linvite de commande, vous pouvez essayer:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1
supprime la première ET la dernière ligne de mon fichier.txt
, sur Ubuntu 14.04.2LTS.head -n -1
indique quehead: illegal line count -- -1
head -n -1
fonctionne avec GNU coreutils, peut-être que MacOS a une variante BSD?