Połącz linie między określonym wzorem tekstowym w Vimie

8

Mam plik tekstowy, który wygląda następująco:

A.
text
text
text


A.
more text

more text

A.
more text

Chcę połączyć wszystkie linie między „znacznikami” A., aby wyglądało to tak:

A.texttexttext
A.more textmore text
A.more text

Jak mogę to zrobić w Vimie?

vim noob
źródło

Odpowiedzi:

4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Zamień dopasowanie wzoru:

  1. Nowa linia,
  2. grupa zawierająca

    1. nie ciąg znaków, A.po którym bezpośrednio następuje koniec linii
    2. dowolny znak do końca linii

z:

  • wszystko pasowało z wyjątkiem początkowej nowej linii (tj. grupy powyżej),

i rób to globalnie.

Daniel Andersson
źródło
1
Dzięki. Nie mam pojęcia, jak to działa, ale wydaje się, że tak! Będę musiał dokładnie to przeanalizować. Znalazłem też obejście, łącząc wszystkie linie, a następnie wstawiając nową linię w „A.”
vim noob
@vimnoob: Zobacz :help \@!w Vimie, aby uzyskać więcej informacji na temat tej części. Mam nadzieję, że w przeciwnym razie jest to proste z moim wyjaśnieniem. Problem z twoim podejściem polega na tym, że jeśli A.w tekście występuje „ ”, ale nie jako izolowana linia znacznika, zostanie on podzielony tak, jakby był pierwotnie znacznikiem. W praktyce może to nie stanowić problemu (nie wiem, jak wygląda Twój „prawdziwy” plik), ale ogólnie może powodować niepożądane zachowanie, jeśli nie jest się tego świadomym.
Daniel Andersson
@vimnoob: Ponownie przeczytałem moją odpowiedź, a jeśli nie znasz :%s///składni: w Vimie jest to składnia „szukaj i zamień”. :uruchamia polecenie, %określa cały bufor jako zakres, srozpoczyna podstawienie. /jest ogranicznikiem wzorca (można użyć dowolnego innego znaku, ale /jest on „standardowy”). Pierwszy /rozpoczyna wzorzec wyszukiwania, drugi zastępuje wzorzec, a trzeci go kończy. Dostępne są modyfikatory końcowe, aby określić rozróżnianie wielkości liter itp. \1Reprezentuje grupę wziętą do wzorca wyszukiwania. :%s/foo/bar/zastępuje foosię barw pliku.
Daniel Andersson
Bardzo dziękuję za Twoją pomoc. Muszę tylko to zbadać \ @! część, ponieważ jestem zaznajomiony z podstawowymi funkcjami wyszukiwania i podstawowymi wyrażeniami regularnymi.
vim noob
1
@Reman: Najprostszym sposobem, o którym od razu myślę, jest przeprowadzenie kolejnego globalnego dopasowania wzorca :%s/^A\.//. Metoda w odpowiedzi nie przechwytuje ^A\.samych wzorców (a raczej ich braku), więc nie może modyfikować tych ciągów w oczywisty sposób.
Daniel Andersson,
7

Działa to również (gdy zaczyna się pierwsza linia A.)

:v/^A/-1j!
Miro
źródło
To działa! Miły. +1
ZaSter
Tak, naprawdę, i dwie nowe sztuczki dla mnie, po globalnym dopasowaniu anty-wzorców (v): „j” dla przyłączenia i „!” do przyłączenia bez dodawania spacji. Dziękuję Ci.
fortboise
@Miro wow! pozdrawiam pana. jeśli mógłbyś wyjaśnić, dlaczego to działa, to super! .. także musiałem połączyć wiersze ze znakiem tabulacji pomiędzy ... więc zrobiłem to, dodając jako / $ / \ t / g znak tabulacji na końcu każdej linii przed wydaniem powyżej komendy .. jakikolwiek lepszy sposób
ihightower 13.01.17