Odpowiedzi:
Powodem, dla którego file.txt jest pusty po tym poleceniu, jest kolejność, w jakiej powłoka wykonuje różne czynności. Pierwszą rzeczą, która dzieje się z tą linią, jest przekierowanie. Plik „file.txt” zostaje otwarty i obcięty do 0 bajtów. Następnie uruchamia się polecenie sed, ale w tym momencie plik jest już pusty.
Istnieje kilka opcji, większość z nich polega na zapisaniu do pliku tymczasowego.
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
Komenda będzie: printf "%s\n" 1d w q | ed file.txt
(I serce ed)
-exec sed -i '1d' {} \;
Alternatywną, bardzo lekką opcją jest po prostu „ogonowanie” wszystkiego oprócz pierwszej linii (może to być łatwy sposób na usunięcie nagłówków plików):
# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
Śledząc @Evan Teitelman, możesz:
tail -n +2 file.txt | sponge file.txt
Aby uniknąć pliku tymczasowego. Inną opcją może być:
echo "$(tail -n +2 file.txt)" > file.txt
I tak dalej. Testowanie ostatniego:
[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 ~]$
Ups, zgubiliśmy nowy wiersz (na komentarz @ 1_CR poniżej), spróbuj zamiast tego:
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 ~]$
Wracając do sed, spróbuj:
printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
a może
echo -e "$(sed '1d' file.txt)\n" > file.txt
Aby uniknąć skutków ubocznych.
tail
Sztuczka pracował dla mnie (trwało mniej niż 3 sekundy na pliku 130MB). Dzięki!
echo "$(tail -n +2 file.txt)" > file.txt
jest idealną odpowiedzią.
Również przyjrzeć się sponge
z
moreutils
. sponge
przesiąka w danych ze standardowego wejścia, dopóki koniec zapisu standardowego wejścia nie zamknie się przed zapisaniem do pliku. Używa się go tak:
sed '1d' file.txt | sponge file.txt
Ten temat jest interesujący, więc testuję test porównawczy na 3 sposoby:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
Pamiętaj, że celem d.txt
jest plik o pojemności 5,4 GB
Uzyskaj wynik:
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
Wniosek: wydaje się, że poniżej jest najszybszy sposób:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
sed '1d' d.txt
metoda nie zawierała (a przynajmniej tak się wydaje, czytając testy) mv
polecenia. W moich testach na FreeBSD z plikiem 20 MB sed -i
był najszybszy.
ex
może być używany do prawdziwej edycji w miejscu, która nie wymaga pliku tymczasowego
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
. ex obcina oryginalny plik plikiem tymczasowym, gdzie jako opcja -i w GNU sed zastępuje oryginał plikiem tymczasowym. Nie jestem pewien, jak działa sed BSD.
Najkrótszym i najprostszym sposobem usunięcia pierwszego wiersza z pliku sed
jest:
$ sed -i -n -e '2,$p' file.txt
Możesz używać Vima w trybie Ex:
ex -s -c '1d|x' file.txt
1
znajdź pierwszą linię
d
usunąć
x
Zapisz i zamknij
To polecenie usunie 1 linię i zapisze jako „plik.txt”.
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
Aby usunąć wiersz praticiler w pliku
Plik „1d” Sed
Plik „1d3d” Sed
Usuń charecter w linii
1 Usuń Pierwsze dwie karty w linii
Plik Sed /^..// 'Sed
2 Usuń dwie ostatnie linie chrectercin
Plik Sed / .. £ //
3 Usuń pusty wiersz
Plik Sed '/ ^ £ / d'
£
≠ $
.
Przydałby się do tego vim:
vim -u NONE +'1d' +wq! /tmp/test.txt
plik kota 01 | sed -e „1,3d”
// pokaż zawartość w pliku 01, ale usuń pierwszy i trzeci wiersz
sed
możesz korzystaćsed -i .bak '1d' file.txt
.