Chcę usunąć kilka n wierszy z końca pliku. Czy można to zrobić za pomocą seda?
Na przykład, aby usunąć linie od 2 do 4, mogę użyć
$ sed '2,4d' file
Ale nie znam numerów linii. Mogę usunąć ostatnią linię za pomocą
$sed $d file
ale chcę wiedzieć, jak usunąć n wierszy z końca. Daj mi znać, jak to zrobić używając seda lub innej metody.
sed
?sed $d file
zwraca błąd. Zamiast tego $ d powinno znajdować się w cudzysłowie, na przykład:sed '$d' file
Odpowiedzi:
Nie wiem
sed
, ale można to zrobić za pomocąhead
:źródło
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
dla ostatnich 5 wierszy).head
, ale nie jest standardowe. Rzeczywiście, standard dlahead
stanów:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Jeśli twarde kodowanie n jest opcją, możesz użyć sekwencyjnych wywołań seda. Na przykład, aby usunąć ostatnie trzy wiersze, trzykrotnie usuń ostatni wiersz:
źródło
Z sedesów :
Wydaje się, że to jest to, za czym tęsknisz.
źródło
10
in'$d;N;2,10ba'
Zabawne i proste
sed
itac
rozwiązanie:UWAGA
"
Aby powłoka obliczyła$n
zmienną wsed
poleceniu, potrzebne są podwójne cudzysłowy . W pojedynczych cudzysłowach nie zostanie wykonana żadna interpolacja.tac
jestcat
odwrócona, widzicieman 1 tac
{}
wsed
są tam, aby oddzielić$n
id
(jeśli nie, spróbuj powłoki interpolować non istniejącej$nd
zmiennej)źródło
tac
na osxport info coreutils
||brew info coreutils
;Użyj
sed
, ale pozwól powłoce wykonać obliczenia, mając na celu użycied
polecenia przez podanie zakresu (aby usunąć ostatnie 23 wiersze):Aby usunąć ostatnie 3 wiersze, od wewnątrz:
Podaje liczbę wierszy pliku: powiedzmy 2196
Chcemy usunąć ostatnie 23 wiersze, więc dla lewej strony lub zakresu:
Daje: 2174 Tak więc oryginalny sed po interpretacji powłoki to:
Dzięki
-i
edycji w miejscu plik ma teraz 2173 wierszy!Jeśli chcesz zapisać go w nowym pliku, kod to:
źródło
Możesz użyć do tego głowy .
Posługiwać się
$ head --lines=-N file > new_file
gdzie N to liczba wierszy, które chcesz usunąć z pliku.
Zawartość oryginalnego pliku bez ostatnich N linii znajduje się teraz w new_file
źródło
Dla kompletności chciałbym dodać moje rozwiązanie. Skończyło się na tym, że zrobiłem to ze standardem
ed
:To usunie ostatnie 2 linie za pomocą edycji w miejscu (choć nie użyć pliku tymczasowego w
/tmp
!!)źródło
Aby naprawdę obciąć bardzo duże pliki, mamy
truncate
polecenie. Nie wie o liniach, aletail
+wc
potrafi konwertować linie na bajty:Jeśli plik jest zapisywany w tym samym czasie, istnieje oczywisty wyścig. W tym przypadku może być lepiej użyć
head
- liczy bajty od początku pliku (pamiętaj o IO dysku), więc zawsze będziemy obcinać granicę linii (prawdopodobnie więcej linii niż oczekiwano, jeśli plik jest aktywnie zapisywany):Poręczna jedna linijka, jeśli nie uda Ci się zalogować, podając hasło zamiast nazwy użytkownika:
źródło
To może zadziałać dla Ciebie (GNU sed):
źródło
'
).d
,D
lubP
z GNU sed, a nie w wersji posix. Wydaje się, że wiersze nie są drukowane po znakuD
i pozostają w roboczym buforze dla nowej pętli bez przechodzenia do 'końca' linii akcji.D
wykonaniu odwrotnego efektu.Większość z powyższych odpowiedzi wydaje się wymagać poleceń / rozszerzeń GNU:
Aby uzyskać nieco bardziej przenośne rozwiązanie:
LUB
LUB
Gdzie „10” to „n”.
źródło
Dzięki odpowiedziom tutaj dowiedziałeś się już, że sed nie jest najlepszym narzędziem do tej aplikacji.
Jednak myślę, że jest na to sposób, używając seda; pomysł polega na dodaniu N linii, aby zachować spację, dopóki nie będziesz w stanie czytać bez naciskania EOF. Po trafieniu EOF wypisuje zawartość miejsca wstrzymania i zakończ.
Powyższe polecenie sed pominie ostatnie 5 wierszy.
źródło
Wypróbuj następujące polecenie:
źródło
=
.tail -r
którym inni używalitac
do odwrócenia kolejności linii i sprawienia, że ostatnien
linie staną sięn
pierwszymi.Można to zrobić w 3 krokach:
a) Policz liczbę wierszy w pliku, który chcesz edytować:
b) Odejmij od tej liczby liczbę linii do usunięcia:
c) Powiedz sedowi, aby usunął od tego numeru linii (
$x
) do końca:źródło
sed
do usuwania linii od 7 do 10, czyli 4 linie, a nie 3.Możesz uzyskać całkowitą liczbę linii
wc -l <file>
i użyćhead -n <total lines - lines to remove> <file>
źródło
Spowoduje to usunięcie ostatnich 3 wierszy z
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
źródło
sed
.Wolę to rozwiązanie;
gdzie N to liczba linii do usunięcia.
źródło
wersja posix
źródło
Aby usunąć ostatnie 4 wiersze:
źródło
tac file | sed '1,4d' | tac
dlatego, że sortowanie, a następnie usuwanie prefiksu kosztuje dużo zasobów.tac
polecenia w niektórych systemach (na przykład FreeBSD?)Wymyśliłem to, gdzie n to liczba linii, które chcesz usunąć:
To małe rondo, ale myślę, że łatwo jechać.
źródło
Aby usunąć ostatnie N wierszy pliku, możesz użyć tej samej koncepcji
Możesz użyć kombi z poleceniem tail, aby odwrócić plik: jeśli N to 5
I w ten sposób działa również tam, gdzie
head -n -5 file
polecenie nie działa (jak na Macu!).źródło
Spowoduje to usunięcie ostatnich 12 wierszy
źródło