Cómo obtener la primera línea de un archivo de texto de entrada, mientras se elimina esa línea del archivo de texto

11

¿Cómo puedo obtener la primera línea de un archivo de texto de entrada, mientras borro esa línea del archivo de texto?

Si tuviera un archivo de texto /myPathToTheFile.txtcomo este

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

Me gustaría obtener esta línea como salida

► put returns between paragraphs

y mi archivo de texto ahora debería ser así

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
fuente
Tenga en cuenta que el costo de esta operación es proporcional al tamaño del archivo. Entonces, si el archivo es grande y lo hace a menudo, será muy lento.
CodesInChaos

Respuestas:

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

o

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

o, menos escribiendo:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Jeff Schaller
fuente
Wow, buen uso de ed ...!
qwr
10

Al menos con 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**

Con GNU sed se puede escribir como una línea

sed -i -e '1 {w /dev/stdout' -e 'd}' file
conductor de acero
fuente
6

Suponiendo que está solicitando un script de shell, esto hará lo que solicitó:

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

Se puede utilizar head, taily mv:

Mostrar la primera línea:

head -1 myPathToTheFile.txt

Manteniendo las últimas ( +2) líneas:

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

Usando descriptores de archivos y un poco 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
fuente
1

Usando cabeza y cola. El archivo es target.txt

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

Nota: Asegúrese de que no haya un archivo tmp existente en la carpeta actual, de lo contrario, se eliminará.

Explicación:

  • "head -1" selecciona la primera línea
  • "tail -n + 2 target.txt> tmp" selecciona todas las líneas desde el 2º en adelante (incluidas) y las coloca en tmp
  • mv sobrescribe el archivo original con tmp
  • rm tmp eliminará el archivo tmp así creado
Valyrian
fuente