Vim: consolidar linhas correspondentes à expressão regular

3

Eu colei um log gerado pelo rsync em execução no Cygwin em um servidor Windows 2008. Estou rsync'ing dados para um novo servidor de arquivos (Synology), e depois de aparar qualquer coisa que não é um erro, eu tenho alguns erros diferentes para lidar, e eles estão todos entrelaçados.

O que eu quero é rápida e facilmente, de preferência com vim, separar os diferentes tipos de erros, para que todas as linhas que começam com "rsync: send_files (blah blah)" sejam consolidadas, e todas as linhas que comece com "o arquivo desapareceu:" está consolidado, etc.

Basicamente eu estou tentando encontrar uma maneira de combinar um regex, yank / delete todas as linhas pertinentes e colá-las no mesmo arquivo, mas todas no mesmo lugar, ou em um novo arquivo / buffer.

EDIT: um pensamento só me ocorreu. Se eu ordenasse esses dados, provavelmente faria o que eu queria. Eu poderia fazer isso com ferramentas externas, mas é possível fazer isso dentro do vim, seja chamando sort no vim ou melhor ainda, usando ferramentas dentro do ambiente nativo do vim. Realmente estou usando isso como um exercício para mim, aprendendo a usar melhor o vim, e não outras ferramentas.

Uma pequena amostra do arquivo de log, com algumas informações editadas:

rsync: send_files failed to open "/cygdrive/E/Users/SharedFiles/3DS SALES/3DS MARKETING/PORTFOLIOS/2012 - Portfolios/Signage"XXXXXXXX Full Res photos/xxxxx xx sky/.DS_Store": Permission denied (13)
file has vanished: "/cygdrive/E/Users/SharedFiles/3DS SALES/CURRENT SALES/xxxxxxxxx xxx xxxxx xxxxx xxxx - xxxx/02_PROPOSAL-QUOTATION/15-002 - xxxx xxxx xxxx - Replacement  Private Fuction  Event Board.xlsx"
rsync: opendir "/cygdrive/E/Users/SharedFiles/3DS SALES/CURRENT SALES/Archived Projects/ARCHIVES -xxxxx light/Hootsuite xxxxxx Info" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/3DS STAFF/Cortney/xxxxx/MANUAL/Support Files/xxx/Photos-Jan-2013" failed: Permission denied (13)
file has vanished: "/cygdrive/E/Users/SharedFiles/3DS STAFF/Reg/2012 - DEAD PROJECTS/2213-xxxxxx&am;C 60x114-5-HR_pdf/xxxxxx 60 x114.5 _HR.pdf"
file has vanished: "/cygdrive/E/Users/SharedFiles/3DS STAFF/Reg/2012 - DEAD PROJECTS/2213-xxxxxx&am;C 60x114-5-HR_pdf/xxxxxx 47 x94_HR.pdf"
Time value of 3DS STAFF/X-employees/xxxxxxx/Jobs- do not remove/1OLD FILES/J-M/Jade/xxxxx logo_cmyk.ai-print on paper.eps truncated on receiver.
Time value of 3DS STAFF/X-employees/xxxxxx/Jobs- do not remove/1OLD FILES/J-M/Jade/xxxx logo_rgb.ai-website.eps truncated on receiver.
file has vanished: "/cygdrive/E/Users/SharedFiles/3DS STAFF/X-employees/xxxxx/Found on iMac/xxxxxx FOLDER/Databases " Presentations " Portfolios/Databases/Database  C .xlsx"
file has vanished: "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/ARTWORK DRAWINGS/xxxxx Graphic Layouts/Batch 4 pdfs for Trish/kathy's Batch 4 pdfs for xxxxx/Links/1 =1' person .eps"
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/ MANUAL FOR CLIENT" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/SECTION 2.0-Exhibits" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/SECTION 7.0_Appendices/Appendix E - Artifact Conservation and Maintenance Manual" failed: Permission denied (13)
    
por Harv 06.12.2014 / 21:47

3 respostas

1

Use redir para redirecionar para um novo arquivo:

:redir > rsync.log
:g/^rsync/
:redir > file_vanished.log
:g/^file/
:redir END
:q

cat rsync.log
rsync: send_files failed to open "/cygdrive/E/Users/SharedFiles/3DS SALES/3DS MARKETING/PORTFOLIOS/2012 - Portfolios/Signage"XXXXXXXX Full Res photos/xxxxx xx sky/.DS_Store": Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/3DS SALES/CURRENT SALES/Archived Projects/ARCHIVES -xxxxx light/Hootsuite xxxxxx Info" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/3DS STAFF/Cortney/xxxxx/MANUAL/Support Files/xxx/Photos-Jan-2013" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/ MANUAL FOR CLIENT" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/SECTION 2.0-Exhibits" failed: Permission denied (13)
rsync: opendir "/cygdrive/E/Users/SharedFiles/CURRENT FILES/12050 - xxxxx Canada - xxxxx National Park/MANUAL/03_ xxxxx Final Manual_June-2014/SECTION 7.0_Appendices/Appendix E - Artifact Conservation and Maintenance Manual" failed: Permission denied (13)
    
por 06.12.2014 / 22:11
2

Você pode usar :redir para isso:

                                                        *:redi* *:redir*
:redi[r][!] > {file}    Redirect messages to file {file}.  The messages which
                        are the output of commands are written to that file,
                        until redirection ends.  The messages are also still
                        shown on the screen.  When [!] is included, an
                        existing file is overwritten.  When [!] is omitted,
                        and {file} exists, this command fails.
                        Only one ":redir" can be active at a time.  Calls to
                        ":redir" will close any active redirection before
                        starting redirection to the new target.

Então, para capturar suas mensagens desejadas e anexá-las ao arquivo atual:

:redir @+
:g/vanished/
:g/send_files/
:g/any_other_regex_you_want/
:redir END
"+P

Isto irá enviar correspondências regex para o registrador da área de transferência ( @+ ) e depois colá-las no documento atual: " + P .

    
por 06.12.2014 / 22:04
1

Você pode usar a lista de correções rápidas para coletar todas as linhas correspondentes, com :vimgrep . Por exemplo:

:vimgrep /^rsync: / %
:copen

Alternativa de plug-in

Meu plug-in ExtractMatches fornece (entre outros) um comando :GrepToReg . Com ele, você pode coletar as linhas correspondentes em um registrador e colá-las em um novo buffer de rascunho:

:GrepToReg /^rsync:/
:new | put!
    
por 06.12.2014 / 22:23

Tags