Używam sed
do szybkiego usuwania linii o określonej pozycji jako
sed '1d'
sed '5d'
Ale co, jeśli chcę usunąć ostatni wiersz pliku i nie znam liczby wierszy (wiem, że mogę to zrobić za pomocą wc
kilku innych sztuczek).
Obecnie za pomocą obejścia tego problemu head
i w tail
połączeniu z nim wc
. Jakieś szybkie zwroty tutaj?
text-processing
sed
Mt.
źródło
źródło
head
itail
...head
itail
znasz różne smaki?Odpowiedzi:
w sed
$
jest ostatnim wierszem, więc aby usunąć ostatni wiersz:źródło
sed -i '$d' <file>
do edycji pliku na miejscu.$ za ostatnią linię:
źródło
sed '$d' file; sed '$d' file
sed '$d' file
tak naprawdę nie modyfikuje pliku; po prostu drukuje zawartość pliku, minus ostatni wiersz. Tak więcsed '$d' file; sed '$d' file
wydrukuje zawartość pliku dwukrotnie , za każdym razem minus ostatni wiersz. Odpowiednik usuwania ostatnich dwóch liniised '$d' file
tosed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Nadąsałem się, że nie możemy tego zrobićsed '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Uważaj, wydaje się, że w zależności od ostatniego wiersza
file.txt
(jeśli kończy się naEOF
,\n
a następnieEOF
), liczba wierszynew_file.txt
może być taka sama (jakfile.txt
) po tym poleceniu (dzieje się tak, gdy nie ma\n
) - w każdym razie, zawartość ostatniego wiersza zostanie usunięta.Pamiętaj też, że musisz użyć drugiego (pośredniego) pliku. Jeśli przechwycisz i przekierujesz do tego samego pliku, usuniesz go.
źródło
head -n -1 file.txt > new_file.txt
. Należy jednak pamiętać, że ujemne liczeniehead -n
jest dostępne tylko dla niektórych implementacjihead
. Na przykład nie działa dla FreeBSD ani dla wersji BusyBoxhead
.head -n -1 file.txt > new_file.txt
jest lepszy. Działa to w ten sam sposób w odniesieniu do moich dwóch komentarzy (ta sama liczba wierszy i usuwanie w tym samym pliku). Co do argumentu negatywnego, takie różnice występują od czasu do czasu między Unixami i często są frustrujące, ponieważ oczekujesz, że będzie to w całości to samo polecenie (i dlaczego nie miałbyś - tej samej nazwy i celu!) - w każdym razie dobre punkt. (Używam Debiana.)head --lines=-1
. Najpierw natknąłem się na tę możliwość na stronie podręcznika użytkownika na temat systemu SLES11SP2 (coreutils-8.12-6.23.1)tail
ihead
są częściącoreutils
-rpm (przynajmniej dla systemów opartych na rpm).Zgodnie z dziennikiem zmian coreutils ta składnia jest obsługiwana od wersji coreutils 5.0.1
Złe wieści: Według strony podręcznika RH5 ta opcja nie jest opisana
Dobra wiadomość: działa z RH5 (więc w twoim przypadku: działa - przynajmniej z bieżącą wersją RH5).
rpm -q coreutils
pokazuje mi (na CentOS 5.8): coreutils-5.97-34.el5_8.1Nie jestem pewien, czy RH5.5. ma już wersję coreutils, która ją obsługuje. Ale 5.5 i tak ma EoLed.
źródło
Linux
$ jest ostatnim wierszem, d do usunięcia:
System operacyjny Mac
Odpowiednik sed--i
źródło