Dosyanın ilk satırını sil


110

Bir dosyanın ilk satırını nasıl silebilir ve değişiklikleri saklayabilirim?

Bunu denedim ama dosyanın tüm içeriğini siler.

$sed 1d file.txt > file.txt

Yanıtlar:


81

File.txt dosyasının bu komuttan sonra boş olmasının nedeni, kabuğun işleri yaptığı sıradır. Bu satırda olan ilk şey yönlendirmedir. "File.txt" dosyası açılır ve 0 bayt olarak kesilir. Bundan sonra sed komutu çalışır, ancak noktada dosya zaten boştur.

Çoğu geçici bir dosyaya yazmayı içeren birkaç seçenek vardır.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file

2
BSD ile sedkullanabilirsiniz sed -i .bak '1d' file.txt.

1
temp dosyası içermeyen bir yol var mı? Her neyse, bu işe yarayacak. Çok teşekkürler!
— kickass13 16:13

@ kickass13 muhtemelen gibi bir metin editörü kullanarak ed.
— jordanm

6
edKomut şöyle olacaktır: printf "%s\n" 1d w q | ed file.txt(I kalp ed)
— Glenn Jackman

1
@jonayreyes-exec sed -i '1d' {} \;
— jordanm

141

Alternatif, çok hafif bir seçenek, ilk satır dışında her şeyi 'kuyruk' haline getirmektir (bu genellikle dosya başlıklarını kaldırmak için kolay bir yol olabilir):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

@Evan Teitelman'ın ardından şunları yapabilirsiniz:

tail -n +2 file.txt | sponge file.txt

Geçici bir dosyayı önlemek için. Başka bir seçenek olabilir:

echo "$(tail -n +2 file.txt)" > file.txt

Ve bunun gibi. Sonuncuyu test etmek:

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

Hata! Yeni bir satır kaybettik (aşağıda @ 1_CR yorum başına), bunun yerine deneyin:

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

Sed geri geliyor, deneyin:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

ya da belki

echo -e "$(sed '1d' file.txt)\n" > file.txt

Yan etkilerden kaçınmak için.


Sadece Fedora sistemimde denedim ve çıktı yukarıda. Haklısın - bunu gösterdiğin için teşekkürler.
— AsymLabs

tailBenim için çalıştı hile (bir 130MB dosya üzerinde en az 3 saniye sürdü). Teşekkürler!
— elo80ka

echo "$(tail -n +2 file.txt)" > file.txtmükemmel bir cevap.
— Alex Raj Kaliamoorthy,

Teşekkür ederim! echo "$ (tail -n +2 file.txt)"> file.txt benim için bir çekicilik gibi çalışır!
— Arsenii

16

Ayrıca bir göz atın spongedan moreutils. spongebir dosyaya yazmadan önce standart girişin yazma sonu kapanana kadar standart girdiden veri içeriyor. Bu şekilde kullanılır:

sed '1d' file.txt | sponge file.txt

14

Bu konu ilgi duyuyor, bu yüzden testi 3 şekilde test ediyorum:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

Hedef d.txt5.4GB dosya olduğuna dikkat edin.

Sonucu alın:


run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

Sonuç: En hızlı yol aşağıda görünmektedir:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


Kişisel sed '1d' d.txtyöntem içermiyordu (ya da öyle testlerinizi okuyarak görünüyor) mvkomutunu. FreeBSD’de 20 MB’lık bir dosyayla yaptığım testler sed -ien hızlısıydı.
— Sopalajo de Arrierez,

9

extemp dosyası içermeyen gerçek yerinde düzenleme için kullanılabilir

ex -c ':1d' -c ':wq' file.txt

2
ex bir temp dosyası kullanıyor. strace -e open ex -c ':1d' -c ':wq' foo. ex, orijinal dosyayı temp dosyasıyla keser, burada GNU sed'in -i seçeneği, orijinalin temp dosyasıyla üzerine yazmaktadır. BSD'nin ne işe yaradığından emin değilim.
— llua

@llua, haklısın. Ben de farkettim, ama daha sonra
— iruvar

3

İlk satırı bir dosyadan silmenin en kısa ve en basit yolu sedşudur:

$ sed -i -n -e '2,$p' file.txt

3

Vim'i Ex modunda kullanabilirsiniz:

ex -s -c '1d|x' file.txt
  1. 1 ilk satırı bul

  2. d silmek

  3. x kaydet ve kapat


0

Bu komut 1 satırı kaldıracak ve "file.txt" olarak kaydedecektir.

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

Dosyadaki bir praticiler satırını silmek için

  1. İlk satırı sil

Sed '1d' dosyası

  1. Birinci ve üçüncü satırları sil

Sed '1d3d' dosyası

Satırdaki satırı sil

1 Sil Lin'deki ilk iki charter

Sed 's /^..//' dosyası

2 Son iki chrectercin satırını sil

Sed 's / .. £ //' dosyası

3 Boş satırı sil

Sed '/ ^ £ / d' dosyası


4
İngilizler kolonileri tekrar ele geçirdi mi? En son baktığımda, £≠ $.
— G-Man

£ doller işareti belirtildi ..
— Vivek parikh 22:15

0

Bunu yapmak için vim kullanabilirsiniz:

vim -u NONE +'1d' +wq! /tmp/test.txt

-2

kedi dosyası01 | sed -e '1,3d'

// file01'de içerik göster ancak birinci ve üçüncü satırları kaldır


2
Vereceğiniz sed komutu 1, 2 ve 3 numaralı satırları kaldıracaktır.
— icarus

1
Bu istenenden daha fazla siler ve "değişiklikleri
— koruyamaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.