Czy istnieje polecenie, które pozwoli mi edytować ostatnie n wierszy w pliku? Mam kilka plików, z których wszystkie mają inną liczbę linii w środku. Ale chciałbym zmodyfikować ostatnie n wierszy w każdym pliku. Celem jest zastąpienie przecinków średnikami w ostatnich n wierszach. Ale tylko w ostatnich n wierszach.
Nie chcę usuwać żadnych wierszy, chcę po prostu zastąpić każdy przecinek średnikiem w ostatnich n wierszach każdego pliku.
Za pomocą polecenia sed jestem w stanie zastąpić ostatni wiersz tym poleceniem. Jak opisano tutaj: Jak mogę usunąć tekst z ostatniego wiersza pliku?
Ale to pozwala mi tylko modyfikować ostatnią linię, a nie ostatnią n liczbę linii.
text-processing
awk
sed
sku2003
źródło
źródło
sed '24,$s/,/:/g' filename
gdzie24
jest linia początkowa`Odpowiedzi:
Aby zastąpić przecinki średnikami w ostatnich n wierszach
ed
:Podział tego na części:
ed -s
= uruchom ed po cichu (nie zgłaszaj bajtów zapisanych na końcu)'$-'
= od końca pliku ($
) minus ...$((n-1))
= n-1 linii ...$' ... '
= cytuje resztę polecenia, aby chronić je przed powłoką),$s/,/;/g
= ... do końca pliku (,$
), wyszukaj i zamień wszystkie przecinki na średniki.\nwq
= zakończ poprzednie polecenie, a następnie zapisz i wyjdźAby zastąpić przecinki średnikami w ostatnich n wierszach
sed
:Rozbijając to na części:
-i
= edytuj plik „w miejscu”$(( ... ))
= zrób trochę matematyki:$( wc -l < input)
= uzyskaj liczbę wierszy w pliku-n + 1
= cofnij się o n-1 linii,\$
= od n-1 linii do końca pliku:s/,/;/g
= zamień przecinki na średniki.źródło
wc -l < input
zwc -l input
. Powinno być szybsze o kilka nanosekund :)wc -l input
wyświetla również nazwę pliku; chcemy tylko liczby liniiRozwiązanie za pomocą tac i sed, aby zastąpić każdy przecinek średnikiem w ostatnich 50 wierszach pliku.txt:
źródło
Z GNU
head
i powłoką podobną do Bourne'a:Zastępujemy sam plik. To jest OK tu na transliteracji bajt-do-bajta ale niekoniecznie jeśli modyfikacja implikuje zmianę rozmiaru pliku (w tym przypadku, to chciałby zamienić
1<> file
z> other-file && mv other-file file
na przykład).źródło
1<>
, których nie znałem. Ponadtosponge
z moreutils jest dobrym narzędziem do rurociągów, w których chcesz zastąpić dane wejściowe.Załóżmy, że chcemy zastąpić ostatnie
7
wiersze poniższej sekwencji skryptem powłoki i implementacją GNUsed
:Krok 1 : pozwala uzyskać ostatni numer wiersza sekwencji, jak poniżej. Spójrz na to i tamto :
Krok 2 : Ustawmy liczbę linii (na końcu sekwencji), które zamierzamy edytować:
Krok 3 : pozwala obliczyć linię początkową na podstawie poprzednich zmiennych, takich jak następujące. Spójrz na to :
Krok 4 : Teraz możemy zamienić ostatnie 7 wierszy sekwencji na coś innego, na przykład: Spójrz na to :
Krok 4 wykorzystuje sekcja 4.4 strony podręcznika sed, która mówi:
Krok 4 również wykorzystuje podwójne cudzysłowy, jak wspomniano tutaj .
Cóż, 4 kroki są niepotrzebne, jeśli użyjemy odpowiedzi Gohu w następujący sposób:
źródło
Użyj
tail
i potokuj, aby sed:tail -n 20 file | sed 's/,/;/g'
Działa to na plik dla ostatnich 20 linii. Jeśli chcesz, aby twoje pliki bezpośrednio kierowały do pliku, użyj:
tail -n 20 file | sed -i 's/,/;/g'
źródło