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*

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'

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

6

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

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.