Как получить первую строку входного текстового файла при удалении этой строки из текстового файла

11

Как я могу получить первую строку входного текстового файла, удаляя эту строку из текстового файла?

Если бы я был текстовый файл , /myPathToTheFile.txtкак это

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

Я хотел бы получить эту строку в качестве вывода

► put returns between paragraphs

и мой текстовый файл теперь должен быть таким

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
источник
Обратите внимание, что стоимость этой операции пропорциональна размеру файла. Так что если файл большой и вы делаете это часто, он будет очень медленным.
CodesInChaos

Ответы:

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

или

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

или меньше печатать:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Джефф Шаллер
источник
Ничего себе, хорошо использовать Эд ...!
qwr
10

По крайней мере, с 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**

С GNU sed это можно записать как однострочник

sed -i -e '1 {w /dev/stdout' -e 'd}' file
steeldriver
источник
6

Предполагая, что вы запрашиваете сценарий оболочки, он будет делать то, что вы просили:

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME
Стивен Раух
источник
5
sed -ne '1p' -e '1!s/^//w temp_file' yourfile && mv temp_file yourfile
Ракеш Шарма
источник
2

Вы можете использовать head, tailи mv:

Показать первую строку:

head -1 myPathToTheFile.txt

Сохранение последних ( +2) строк:

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt
GAD3R
источник
1

Использование файловых дескрипторов и немного 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
источник
1

Используя голову и хвост. Файл target.txt

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

Примечание. Убедитесь, что в текущей папке нет файла tmp, иначе он будет удален.

Объяснение:

  • «голова -1» выбирает первую строку
  • «tail -n + 2 target.txt> tmp» выбирает все строки начиная со 2-го (включая) и помещает их в tmp
  • mv перезаписывает оригинальный файл с помощью tmp
  • rm tmp удалит созданный таким образом файл tmp
Valyrian
источник