Yanıtlar:
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
ed
.
ed
Komut şöyle olacaktır: printf "%s\n" 1d w q | ed file.txt
(I kalp ed)
-exec sed -i '1d' {} \;
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.
tail
Benim için çalıştı hile (bir 130MB dosya üzerinde en az 3 saniye sürdü). Teşekkürler!
echo "$(tail -n +2 file.txt)" > file.txt
mükemmel bir cevap.
Ayrıca bir göz atın sponge
dan
moreutils
. sponge
bir 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
Bu konu ilgi duyuyor, bu yüzden testi 3 şekilde test ediyorum:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
Hedef d.txt
5.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
sed '1d' d.txt
yöntem içermiyordu (ya da öyle testlerinizi okuyarak görünüyor) mv
komutunu. FreeBSD’de 20 MB’lık bir dosyayla yaptığım testler sed -i
en hızlısıydı.
ex
temp dosyası içermeyen gerçek yerinde düzenleme için kullanılabilir
ex -c ':1d' -c ':wq' file.txt
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.
Vim'i Ex modunda kullanabilirsiniz:
ex -s -c '1d|x' file.txt
1
ilk satırı bul
d
silmek
x
kaydet ve kapat
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
Dosyadaki bir praticiler satırını silmek için
Sed '1d' dosyası
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ı
£
≠ $
.
Bunu yapmak için vim kullanabilirsiniz:
vim -u NONE +'1d' +wq! /tmp/test.txt
sed
kullanabilirsinizsed -i .bak '1d' file.txt
.