Vim usuń puste linie

674

Jakie polecenie mogę uruchomić, aby usunąć puste wiersze w Vimie?

prawie_lunchtime
źródło

Odpowiedzi:

1233
:g/^$/d

:gwykona polecenie w wierszach pasujących do wyrażenia regularnego. Wyrażenie regularne to „pusta linia”, a polecenie to :d(usuń)

soulmerge
źródło
38
Dzięki soulmerge. To moja ulubiona odpowiedź, ponieważ faktycznie wyjaśnia, co robi polecenie: g.
Tim Swast,
4
Spowoduje to usunięcie wszystkich pustych wierszy (nie zawierają żadnych białych znaków ..), ale może to nie być wyjątkowy wymóg. Ktoś może nadal zachować jedną z pustych linii. :%!cat -smoże być wyborem ..
coanor
2
: g / ^ \ s * $ / d z wyrażeniem regularnym „dowolne spacje char” w wierszu
oyd11
180

Znaleziono to:

g/^\s*$/d

Źródło: Power of g at vim wikia

Krótkie wyjaśnienie :g

:[range]g/pattern/cmd

Działa to na określony [zakres] (domyślnie cały plik), wykonując polecenie Ex cmd dla każdego wzorca pasującego do linii (polecenie Ex to jedno rozpoczynające się dwukropkiem, takie jak :dusuwanie). Przed uruchomieniem polecenia cmd.” jest ustawiany na bieżącą linię.

prawie_lunchtime
źródło
9
Miły. Ale nie do końca pusta linia.
innaM
13
Ach, tak, dopasuje to wiersze zawierające tylko białe znaki. Przyjmę odpowiedź soulmerge.
prawie_lunchtime
16
które powinny pasować do pustych linii ORAZ linii składających się wyłącznie z białych znaków ... (* dopasowuje zero lub wiele wystąpień \ s ...)?
monojohnny,
14
Twierdziłbym, że czysta biała spacja JEST DOKŁADNIE pusta linia, podczas gdy żadna biała spacja nie jest tak naprawdę pustą linią, nie sądzisz? ;)
Kasapo,
4
Oxford twierdzi, że puste miejsce to „miejsce do wypełnienia w dokumencie”. Zinterpretuj to jak możesz, ale tego właśnie szukałem. Dzięki!
Joe Tricarico
53
:v/./d

lub

:g/^$/d

lub

:%!cat -s
mandaleeka
źródło
7
Świetna sztuczka z: v /./ d (łatwiejsze do wpisania), ale potem musisz zrobić: nohl później.
Claes Mogren
1
@ClaesMogren lub po prostu odbij się na control-l
jm3
6
@zladuric według vim.wikia.com/wiki/Power_of_g jest to globalna zmiana (więc wykonuje polecenie na wszystkim, co nie pasuje)
adam_0
44

Poniższych czynności można użyć do usunięcia tylko wielu pustych linii (zredukowania ich do pojedynczej pustej linii) i pozostawienia nienaruszonych pojedynczych pustych linii:

:g/^\_$\n\_^$/d
Draemon
źródło
3
Czy ktoś mógłby wyjaśnić, co oznaczają tokeny? (Więc jak to działa?) Dzięki.
PAStheLoD
5
\_$oznacza end-of-line , które mogą być używane wewnątrz wzoru ( $może być używany tylko na końcu wzorca.) Tak samo jest z \_^tym, że środki początek linii i może być używany w dowolnym miejscu wewnątrz wzorca. Tak więc wzór pasuje do pustej linii, nowej linii i ponownie pustej linii. Zobacz stronę pomocy Vim regex .
Wiktor Stribiżew
1
Inny sposób na zrobienie tego samego::g/^$/,/./-j
SergioAraujo,
14
  1. jak usunąć wszystkie puste pola

    :%s,\n\n,^M,g
    

    (zrób to wiele razy wykorzystując wszystkie puste linie zniknęły)

  2. jak usunąć wszystkie puste pola pozostawiając POJEDYNCZĄ pustą linię

    :%s,\n\n\n,^M^M,g
    

    (zrób to wiele razy)

  3. jak usunąć wszystkie puste pola pozostawiając DWIE puste linie NA MAKSYMALNIE,

    :%s,\n\n\n\n,^M^M^M,g
    

    (zrób to wiele razy)

aby wprowadzić ^ M, muszę kontrolować-Q i Control-M w systemie Windows

gauge00
źródło
2
Możesz również użyć \rzamiast Ctrl-M.
dash-tom-bang
6

Co powiesz na:

:g/^[ \t]*$/d

źródło
5

praca z perlem w vimie:

:%!perl -pi -e s/^\s*$//g

niejieqiang
źródło
Mój perl może być trochę zardzewiały, ale nie chompwykonałby tej pracy?
Mark K Cowan
5

To działa dla mnie

:%s/^\s*$\n//gc

allenhwkim
źródło
Używam czegoś podobnego::%s/^\n//gc
Clint Pachl
5

Ta funkcja usuwa tylko dwa lub więcej pustych wierszy, wstaw poniższe wiersze do vimrc, a następnie użyj \ d, aby wywołać funkcję

fun! DelBlank()
   let _s=@/
   let l = line(".")
   let c = col(".")
   :g/^\n\{2,}/d
   let @/=_s
   call cursor(l, c)
endfun
map <special> <leader>d :keepjumps call DelBlank()<cr>
SergioAraujo
źródło
4

Próbowałem kilka odpowiedzi na tej stronie, ale wiele z nich nie działało dla mnie. Może dlatego, że używam Vima na Windowsie 7 (nie wyśmiewaj się, po prostu lituj się: p)?

Oto najłatwiejszy, jaki znalazłem, który działa na Vimie w systemie Windows 7:

:v/\S/d

Oto dłuższa odpowiedź na Vim Wikia: http://vim.wikia.com/wiki/Remove_unwanted_empty_lines

Ciasny
źródło
3
:g/^\s*$/d
^ begin of a line
\s* at least 0 spaces and as many as possible (greedy)
$ end of a line

pasta

:command -range=% DBL :<line1>,<line2>g/^\s*$/d

w .vimrc, a następnie uruchom ponownie vim. jeśli użyjesz polecenia: 5,12DBL, spowoduje to usunięcie wszystkich pustych linii między 5 a 12 rzędem. Myślę, że moja odpowiedź jest najlepszą odpowiedzią!

cn8341
źródło
Publikując odpowiedzi, dodaj i wyjaśnij, co zmieniłeś lub dodałeś, jak to działa lub coś takiego. Chociaż twoja odpowiedź może być rozwiązaniem, prawdopodobnie niektórzy ludzie, którzy to czytają, nie rozumieją, co to znaczy ani jak działa. I proszę, zrób to po angielsku.
Tim
To tak naprawdę nie ma znaczenia. Na to pytanie przyjęto odpowiedź 5 lat temu
Tim
Myślę, że odpowiedź soulmerge: g / ^ $ / d nie jest najlepszą odpowiedzią. I edytuję, aby poprawić jego odpowiedź za pomocą: g / ^ \ s * $ / d. ale dlaczego nie mogę oglądać mojej edycji w „pokaż wszystkie zmiany w tej pozie”?
cn8341
Moja odpowiedź jest lepsza niż jego odpowiedź, a kto odrzucił moją odpowiedź i dlaczego moja odpowiedź została odrzucona?
cn8341
2

Jeśli coś ma podwójny odstęp między wierszami tekstu, to polecenie usunie podwójne odstępy i połączy istniejące wcześniej powtarzające się puste wiersze w jedną pustą linię. Używa tymczasowego separatora ^^^ na początku linii, więc jeśli koliduje to z twoją treścią, wybierz coś innego. Linie zawierające tylko białe znaki są traktowane jako puste.

%s/^\s*\n\n\+/^^^\r/g | g/^\s*$/d | %s/^^^^.*
Mister W.
źródło
2

Naciśnij deleteprzycisk w trybie wstawiania, aby usunąć puste linie.

akp
źródło
1

To działało dla mnie:

:%s/^[^a-zA-Z0-9]$\n//ig

Zasadniczo usuwa wszystkie wiersze, które nie mają cyfr ani liter. Ponieważ wszystkie elementy na mojej liście miały litery, usunięte zostały wszystkie puste wiersze.

użytkownik1481441
źródło