Cara mendapatkan baris pertama dari file teks input, sambil menghapus baris itu dari file teks

11

Bagaimana saya bisa mendapatkan baris pertama dari file teks input, sambil menghapus baris itu dari file teks?

Kalau saya punya file teks /myPathToTheFile.txtseperti ini

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

Saya ingin mendapatkan baris ini sebagai output

► put returns between paragraphs

dan file teks saya seharusnya sekarang seperti ini

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
sumber
Perhatikan bahwa biaya operasi ini sebanding dengan ukuran file. Jadi jika file tersebut besar dan Anda sering melakukannya, ini akan sangat lambat.
CodesInChaos

Jawaban:

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

atau

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

atau, kurang mengetik:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Jeff Schaller
sumber
Wow, penggunaan ed yang bagus ...!
qwr
10

Setidaknya dengan sed GNU:

$ 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**

Dengan GNU sed dapat ditulis sebagai satu-liner

sed -i -e '1 {w /dev/stdout' -e 'd}' file
Steeldriver
sumber
6

Dengan asumsi Anda meminta skrip shell, ini akan melakukan apa yang Anda minta:

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

Anda dapat menggunakan head, taildan mv:

Tampilkan baris pertama:

head -1 myPathToTheFile.txt

Menjaga baris ( +2) terakhir :

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

Menggunakan file deskriptor dan sedikit 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
sumber
1

Menggunakan kepala dan ekor. File adalah target.txt

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

Catatan: Pastikan tidak ada file tmp di folder saat ini, kalau tidak akan dihapus.

Penjelasan:

  • "head -1" memilih baris pertama
  • "tail -n + 2 target.txt> tmp" memilih semua baris dari tanggal 2 dan seterusnya (termasuk) dan menempatkannya dalam tmp
  • mv menimpa file asli dengan tmp
  • rm tmp akan menghapus file tmp yang dibuat
Valyrian
sumber