Unir linhas entre um determinado padrão de texto no Vim

8

Eu tenho um arquivo de texto que se parece com isso:

A.
text
text
text


A.
more text

more text

A.
more text

Eu quero juntar todas as linhas entre os "marcadores" A. para que se pareça com:

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

Como posso fazer isso no Vim?

vim noob
fonte

Respostas:

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

Substitua uma correspondência de padrão:

  1. nova linha,
  2. um grupo contendo

    1. não a corda A. diretamente seguido pelo fim de linha, então
    2. qualquer personagem até o final da linha

com:

  • tudo combinado, exceto a nova linha inicial (ou seja, o grupo acima),

e fazer isso globalmente.

Daniel Andersson
fonte
1
Obrigado. Eu não tenho ideia de como isso funciona, mas parece que sim! Vou ter que dissecar com cuidado. Também encontrei um trabalho juntando todas as linhas e inserindo uma nova linha em "A".
vim noob
@vimnoob: Veja :help \@! no Vim para mais informações sobre essa parte. Caso contrário, é direto, espero, com a minha explicação. Um problema com sua abordagem é que se " A. "ocorre no texto, embora não como uma linha de marcador isolada, ele será dividido como se fosse originalmente um marcador. Na prática, pode não ser um problema (não sei como é o seu arquivo" real ") , mas genericamente pode causar um comportamento indesejado, se alguém não está ciente disso.
Daniel Andersson
@vimnoob: Eu leio minha resposta novamente, e caso você não esteja familiarizado com o :%s/// Sintaxe: é uma sintaxe de "pesquisa e substituição" no Vim. : inicia o comando % especifica o buffer inteiro como o intervalo, s inicia uma substituição. / é o delimitador de padrão (qualquer outro caractere pode ser usado, mas / é "padrão"). O primeiro / inicia o padrão de pesquisa, o segundo o padrão de substituição e o terceiro termina. Modificadores à direita estão disponíveis para especificar a insensibilidade a maiúsculas e minúsculas, etc. \1 representa o grupo capturado no padrão de pesquisa. :%s/foo/bar/ substitui foo com bar no arquivo.
Daniel Andersson
Muito obrigado por sua ajuda. Eu só preciso pesquisar isso \ @! parte como eu estou familiarizado com a substituição da pesquisa básica e regexp básica.
vim noob
1
@ Reman: A maneira mais direta com a qual penso imediatamente é executar uma correspondência de padrão global subsequente como :%s/^A\.//. O método na resposta não captura o ^A\. padrões próprios (e não a sua ausência), por isso não pode modificar essas cadeias de uma forma óbvia.
Daniel Andersson
7

Isso também funciona (quando a primeira linha começa com A. )

:v/^A/-1j!
Miro
fonte
Isso funciona! Agradável. +1
ZaSter
Sim, em verdade, e dois truques novos para mim, depois do combate anti-padrão global (v): o 'j' para junção e o '!' para entrar sem adicionar um espaço. Obrigado.
fortboise
@Miro uau! eu te saúdo senhor. se você pudesse explicar por que funciona então super! .. também eu tive que concatenar as linhas com o caractere de tabulação entre ... então o que eu fiz foi adicionar como / $ / \ t / g caractere final de cada linha antes de emitir comando acima .. qualquer maneira melhor
ihightower