Як отримати перший рядок вхідного текстового файлу, видаливши цей рядок із текстового файлу


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*

Зауважте, що вартість цієї операції пропорційна розміру файлу. Отже, якщо файл великий і ви робите це часто, він буде дуже повільним.
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

6

Якщо припустити, що ви запитуєте сценарій оболонки, це зробить те, що ви просили:

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


2

Ви можете використовувати head, tailі mv:

Відобразити перший рядок:

head -1 myPathToTheFile.txt

Зберігання останніх ( +2) рядків:

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

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

1

Використання голови та хвоста. Файл - це target.txt

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

Примітка. Переконайтесь, що в поточній папці немає існуючого файлу tmp, інакше він буде видалений.

Пояснення:

  • "head -1" вибирає перший рядок
  • "tail -n + 2 target.txt> tmp" вибирає всі рядки з 2-го каналу (включаючи) і ставить їх у tmp
  • mv перезаписує вихідний файл tmp
  • rm tmp видалить створений таким чином файл tmp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.