Vim: consolide les lignes de regex-matching

J'ai collé un journal généré par rsync exécuté par Cygwin sur un server Windows 2008. Je suis en train de synchroniser datatables sur un nouveau server de files (Synology), et après avoir éliminé tout ce qui n'est pas une erreur, j'ai quelques erreurs différentes à traiter et elles sont toutes entrelacées.

Ce que je veux, c'est de rapidement et facilement, de preference avec vim, séparer les différents types d'erreurs, de sorte que toutes les lignes commençant par "rsync: send_files (blah blah)" soient consolidées et que toutes les lignes commençant par " file a disparu: "sont consolidés, etc.

Essentiellement, j'essaie de find un moyen de faire correspondre une regex, de sortinger / supprimer toutes les lignes pertinentes, puis de les coller dans le même file mais au même endroit, ou dans un nouveau file / buffer.

EDIT: une pensée vient de m'arriver. Si je courais sorting sur ces données, il ferait probablement ce que je voulais. Je pourrais faire cela avec des outils externes, mais est-il possible de le faire dans vim, soit en appelant le sorting dans vim ou mieux, en utilisant des outils dans l'environnement natif de vim. Vraiment, je l'utilise comme un exercice pour moi en apprendre à utiliser vim mieux, pas d'autres outils.

Un petit échantillon du file journal, avec quelques informations expurgées:

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/JM/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/JM/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) 

Utilisez redir pour redirect vers un nouveau file:

 :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) 

Vous pouvez utiliser :redir pour cela:

  *: redi * *: redir *
 : redi [r] [!]> {file} Rediriger les messages vers le file {file}.  Les messages qui
                         sont la sortie des commands sont écrites dans ce file,
                         jusqu'à ce que la redirection se termine.  Les messages sont aussi toujours
                         montré sur l'écran.  Lorsque [!] Est inclus, un
                         le file existant est écrasé.  Lorsque [!] Est omis,
                         et {file} existe, cette command échoue.
                         Un seul ": redir" peut être actif à la fois.  Appels à
                         ": redir" fermera toute redirection active avant
                         commencer la redirection vers la nouvelle cible. 

Donc, pour capturer vos messages souhaités et les append au file actuel:

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

Cela enverra des correspondances regex au registre du presse-papier ( @+ ), puis vous les collerez dans le document courant: " + P.

Vous pouvez utiliser la list embeddede des correctifs pour collecter toutes les lignes correspondantes, avec :vimgrep . Par exemple:

 :vimgrep /^rsync: / % :copen 

Plugin alternative

Mon plugin ExtractMatches fournit (entre autres) une command :GrepToReg . Avec cela, vous pouvez collecter les lignes correspondantes dans un registre, puis les coller dans un nouveau tampon de travail:

 :GrepToReg /^rsync:/ :new | put!