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*

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'

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

6

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

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


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.