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.