Mam plik foo.txt
zawierający następujące wiersze:
a
b
c
Chcę prostego polecenia, które powoduje zawartość foo.txt
:
a
b
bash
command-line
scripting
truncate
Fragsworth
źródło
źródło
sed -i
powyższego polecenia jestsed -i '' -e '$ d' foo.txt
. Ponadtohead -n -1
obecnie nie działa na komputerze Mac.$ d
wyrażeniem regularnym. To rozkaz sed.d
to polecenie służące do usunięcia wiersza, natomiast$
oznacza „ostatni wiersz w pliku”. Podczas określania lokalizacji (zwanej „zasięgiem” w sed lingo) przed poleceniem, polecenie to jest stosowane tylko do określonej lokalizacji. Zatem to polecenie wyraźnie mówi „w zakresie ostatniego wiersza w pliku, usuń go”. Całkiem sprytnie i od razu do rzeczy, jeśli mnie pytasz.Jest to zdecydowanie najszybsze i najprostsze rozwiązanie, szczególnie w przypadku dużych plików:
jeśli chcesz usunąć górny wiersz, użyj tego:
co oznacza linie wyjściowe zaczynające się od linii 2.
Nie używaj
sed
do usuwania linii z góry lub z dołu pliku - jest bardzo bardzo wolny, jeśli plik jest duży.źródło
head -n -1 foo.txt
wystarczybrew install coreutils
(narzędzia GNU core) i używaćghead
zamiasthead
.FILE=$1; TAIL=$2; head -n -${TAIL} ${FILE} > temp ; mv temp ${FILE}
Uruchom go, aby usunąć 4 linie, na przykład z./TAILfixer myfile 4
chmod +x TAILfixer
sed
, to polecenie jest również do cholery powolneMiałem problem ze wszystkimi odpowiedziami tutaj, ponieważ pracowałem z OGROMNYM plikiem (~ 300 Gb) i żadne z rozwiązań nie skalowało się. Oto moje rozwiązanie:
Innymi słowy: znajdź długość pliku, z którym chcesz skończyć (długość pliku minus długość długości ostatniego wiersza, używając
bc
) i ustaw tę pozycję na koniec pliku (wprowadzającdd
jeden bajt/dev/null
na to).Jest to szybkie, ponieważ
tail
zaczyna czytać od końca idd
zastąpi plik na miejscu, zamiast kopiować (i analizować) każdą linię pliku, co robią inne rozwiązania.UWAGA: To usuwa linię z pliku na miejscu! Utwórz kopię zapasową lub przetestuj plik zastępczy przed wypróbowaniem go na własnym pliku!
źródło
Aby usunąć ostatnią linię z pliku bez czytania całego pliku lub przepisywania czegokolwiek , możesz użyć
Aby usunąć ostatni wiersz i wydrukować go na standardowym wyjściu („pop”), możesz połączyć to polecenie z
tee
:Te polecenia mogą skutecznie przetwarzać bardzo duży plik. Jest to podobne i inspirowane odpowiedzią Yossi, ale unika korzystania z kilku dodatkowych funkcji.
Jeśli zamierzasz używać ich wielokrotnie i chcesz obsługiwać błędy oraz niektóre inne funkcje, możesz użyć
poptail
polecenia tutaj: https://github.com/donm/evenmoreutilsźródło
truncate
domyślnie nie jest dostępna w systemie OS X. Ale to jest łatwe do zainstalowania za pomocą Brew:brew install truncate
.jeśli chcesz tylko usunąć wyjście z ostatniego wiersza bez zmiany samego pliku, wykonaj
sed -e '$ d' foo.txt
jeśli chcesz usunąć ostatni wiersz samego pliku wejściowego, zrób to
sed -i '' -e '$ d' foo.txt
źródło
-i ''
mówi sedowi, aby zmodyfikował plik w miejscu, zachowując kopię zapasową w pliku z rozszerzeniem podanym jako parametr. Ponieważ parametr jest pustym ciągiem, plik kopii zapasowej nie jest tworzony.-e
każe sedowi wykonać polecenie. Polecenie$ d
oznacza: znajdź ostatni wiersz ($
) i usuń go (d
).Użytkownicy komputerów Mac:
Na Macu, head -n -1 nie będzie działać. I próbowałem znaleźć proste rozwiązanie (nie martwiąc się czasem przetwarzania), aby rozwiązać ten problem tylko za pomocą poleceń „głowa” i / lub „ogon”.
Wypróbowałem następującą sekwencję poleceń i cieszę się, że mogłem ją rozwiązać za pomocą polecenia „tail” [z opcjami dostępnymi na Macu]. Tak więc, jeśli jesteś na komputerze Mac i chcesz użyć tylko „ogona”, aby rozwiązać ten problem, możesz użyć tego polecenia:
Objaśnienie:
1> tail -r: po prostu odwraca kolejność linii na wejściu
2> tail -n +2: drukuje wszystkie linie zaczynające się od drugiej linii na wejściu
źródło
ghead -n -1
źródło
sed '$d'
.Zasadniczo ten kod mówi:
Dla każdej linii po pierwszej wydrukuj buforowaną linię
dla każdej linii zresetuj bufor
Bufor jest opóźniony o jedną linię, stąd kończy się drukowanie linii od 1 do n-1
źródło
Ten fragment kodu załatwia sprawę.
źródło
Oba te rozwiązania są tutaj w innych formach. Uważam, że są one trochę bardziej praktyczne, jasne i przydatne:
Za pomocą dd:
Za pomocą obcięcia:
źródło
Linux
$ jest ostatnim wierszem, d do usunięcia:
System operacyjny Mac
Odpowiednik sed--i
źródło
Oto, jak możesz to zrobić ręcznie (osobiście często używam tej metody, gdy muszę szybko usunąć ostatnią linię w pliku):
Ten
+
znak oznacza, że gdy plik zostanie otwarty w edytorze tekstów vim, kursor zostanie umieszczony w ostatnim wierszu pliku.Teraz naciśnij
d
dwa razy na klawiaturze. To zrobi dokładnie to, co chcesz - usuń ostatni wiersz. Następnie naciśnij,:
ax
następnie naciśnijEnter
. Spowoduje to zapisanie zmian i powrót do powłoki. Teraz ostatni wiersz został pomyślnie usunięty.źródło
Rubin (1.9+)
źródło