Comment obtenir la première ligne d'un fichier texte d'entrée, tout en supprimant cette ligne du fichier texte

11

Comment puis-je obtenir la première ligne d'un fichier texte d'entrée, tout en supprimant cette ligne du fichier texte?

Si j'avais un fichier texte /myPathToTheFile.txtcomme celui-ci

► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

J'aimerais avoir cette ligne en sortie

► put returns between paragraphs

et mon fichier texte devrait être maintenant comme ça

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
la source
Notez que le coût de cette opération est proportionnel à la taille du fichier. Donc, si le fichier est volumineux et que vous le faites souvent, ce sera très lent.
CodesInChaos

Réponses:

13
ex -s /myPathToTheFile.txt <<\EX
1p
1d
wq
EX

ou

ex -s /myPathToTheFile.txt <<< 1p$'\n'1d$'\n'wq

ou, moins de frappe:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Jeff Schaller
la source
Wow, belle utilisation de ed ...!
qwr
10

Au moins avec GNU sed:

$ cat file
► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

$ sed -i '1{
w /dev/stdout
d}' file
► put returns between paragraphs

$ cat file
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Avec GNU sed, il peut être écrit comme une ligne

sed -i -e '1 {w /dev/stdout' -e 'd}' file
tournevis
la source
6

En supposant que vous demandez un script shell, cela fera ce que vous avez demandé:

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME
Stephen Rauch
la source
5
sed -ne '1p' -e '1!s/^//w temp_file' yourfile && mv temp_file yourfile
Rakesh Sharma
la source
2

Vous pouvez utiliser head, tailet mv:

Affichez la première ligne:

head -1 myPathToTheFile.txt

Garder les dernières +2lignes ( ):

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt
GAD3R
la source
1

En utilisant des descripteurs de fichiers et un peu de python

{
    { 
    head -n1 >&3; 
    3>&- tail -n +1;
    3>&- python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())';
    }<file 1<>file
} 3>&1
iruvar
la source
1

Utilisation de la tête et de la queue. Le fichier est target.txt

head -1 target.txt && tail -n+2 target.txt > tmp
mv tmp target.txt && rm tmp

Remarque: Assurez-vous qu'il n'y a pas de fichier tmp existant dans le dossier actuel, sinon il sera supprimé.

Explication:

  • "head -1" sélectionne la première ligne
  • "tail -n + 2 target.txt> tmp" sélectionne toutes les lignes à partir du 2ème (y compris) et les place dans tmp
  • mv écrase le fichier d'origine avec tmp
  • rm tmp supprimera le fichier tmp ainsi créé
Valyrian
la source