Jak uzyskać pierwszy wiersz wejściowego pliku tekstowego, jednocześnie usuwając ten wiersz z pliku tekstowego

11

Jak mogę uzyskać pierwszy wiersz wejściowego pliku tekstowego, jednocześnie usuwając ten wiersz z pliku tekstowego?

Gdybym miał plik tekstowy /myPathToTheFile.txttakiego

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

Chciałbym uzyskać ten wiersz jako wynik

► put returns between paragraphs

i mój plik tekstowy powinien być teraz taki

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
źródło
Należy pamiętać, że koszt tej operacji jest proporcjonalny do rozmiaru pliku. Więc jeśli plik jest duży i robisz to często, będzie on bardzo wolny.
CodesInChaos

Odpowiedzi:

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

lub

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

lub mniej pisania:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Jeff Schaller
źródło
Wow, fajne wykorzystanie ed ...!
qwr
10

Przynajmniej z 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**

Z GNU sed może być napisany jako jednowierszowy

sed -i -e '1 {w /dev/stdout' -e 'd}' file
steeldriver
źródło
6

Zakładając, że prosisz o skrypt powłoki, zrobi to, o co prosiłeś:

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

Można użyć head, taili mv:

Wyświetl pierwszy wiersz:

head -1 myPathToTheFile.txt

Zachowanie ostatnich ( +2) linii:

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt
GAD3R
źródło
1

Korzystanie z deskryptorów plików i trochę 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
źródło
1

Za pomocą głowy i ogona. Plik to target.txt

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

Uwaga: Upewnij się, że w bieżącym folderze nie ma pliku tmp, w przeciwnym razie zostanie on usunięty.

Wyjaśnienie:

  • „głowa -1” wybiera pierwszą linię
  • „tail -n + 2 target.txt> tmp” zaznacza wszystkie linie od 2. (włącznie) i umieszcza je w tmp
  • mv zastępuje oryginalny plik tmp
  • rm tmp usunie tak utworzony plik tmp
Valyrian
źródło