2013-01-02 8 views
10

Tak jak możemy usunąć (lub zastąpić, szarpnąć itp.) Linie od 4 do 6 od początku pliku w vimie :vim/vi/sed: Działaj na określonej liczbie wierszy od końca pliku

:4,6d 

Chciałbym usunąć (lub zastępować lub Yank, etc.) 4. ostatni do 6 linii od końca pliku. To znaczy, jeśli plik ma 15 linii, zrobiłbym:

:10,12d 

Ale nie można tego zrobić, gdy nie wiem, ile linie są w plikach - i mam zamiar używaj go na wielu plikach. Jak to zrobić w vim i sed?

Zrobiłem w rzeczywistości patrzeć na this post, ale nie znalazłem przydatne.

Odpowiedz

9

Cóż, używając vim można spróbować wykonać następujące czynności - co idzie dość intuicyjne, i tak:

:$-4,$-5d 

Teraz, używając sed nie mogłem znaleźć dokładną drogę, aby to zrobić, ale jeśli można użyć coś innego niż sed, tu idzie rozwiązanie z head i tail:

head -n -4 file.txt && tail -2 file.txt 
+0

Dziękuję. Jak więc zrobić substytucję za pomocą głowy i ogona, tak jak zwykle robię to w sed i vim? – user1271772

+0

'ogon -6 plik.txt | głowa -2 | sed -e '...' ' Zwróć uwagę, że składnia poleceń sed i vim jest trochę inna. Możesz lepiej zapisać plik za pomocą '>', a następnie otworzyć go za pomocą vima. – Forethinker

6

w vim, można odjąć od $ numery linii, co oznacza ostatnim wierszu, na przykład to będzie działać na przestrzeni ostatnich 3 linie:

:$-2,$substitute/... 

W sed, to nie jest takie proste, ponieważ działa na strumień znaków i nie można po prostu wrócić. Będziesz musiał przechowywać pewną liczbę ostatnio widzianej linii w przestrzeni przechowywania , a na końcu strumienia pracować na przestrzeni ładowni. Oto kilka przepisów z sed1line.txt:

# print the last 10 lines of a file (emulates "tail") 
sed -e :a -e '$q;N;11,$D;ba' 

# print the last 2 lines of a file (emulates "tail -2") 
sed '$!N;$!D' 

# delete the last 2 lines of a file 
sed 'N;$!P;$!D;$d' 

# delete the last 10 lines of a file 
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1 
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2 
6

od 4 ostatni do 6 linii od końca pliku: wykorzystać tac odwrócić plikowi

tac filename | sed 4,6d | tac 
1

Może to praca dla Ciebie (GNU sed):

sed -r ':a;${s/([^\n]*\n){3}//;q};N;7,$!ba;P;D' file 

ten działa poprzez poruszający się okno 6 linii w przestrzeni wzoru (PS), a następnie usuwanie pierwsze trzy z nich na encounte zadzwoń do ostatniej linii.

  • :a znajduje się etykieta pętli
  • ${s/([^\n]*\n){3}//;q} usuwanie pierwsze trzy wiersze PS na końcu pliku i wychodzi.
  • N dołączyć nowy wiersz, a następnie następny wiersz do PS.
  • 7,$!ba ", jeśli nielinii 7 do $ (końca pliku), to jest linie 1 do 6, zawrócić na początek tjEtykieta :a
  • P;D dla zakresu linii 7 do $ (EOF) print zapisu do pierwszej nowej linii w PS, a następnie usunąć września włącznie pierwszy znak nowej linii i rozpocząć nowy cykl.

Przedostatnia klauzuli tworzy okno domyślnie, że linie 1 do 6 są dołączane do PS. Od linii 7 do końca linia jest dodawana na końcu, a pierwsza linia jest drukowana, a następnie usuwana.

Alternatywnie:

sed -e ':a' -e '$s/\([^\n]*\n\)\{3\}//' -e '$q' -e 'N' -e '7,$!ba' -e 'P' -e 'D' file 
2

Można użyć 2 karnety z awk, pierwszym przejeździe policzyć liczbę linii, a drugi do wydrukowania lub usunięcia cokolwiek linie lubisz, np

awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd > 6 || fromEnd < 4' file file 

awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd < 6 && fromEnd > 4' file file 
Powiązane problemy