Como cortar um arquivo de texto usando o Vim

3

Como posso cortar um arquivo de texto usando o vim? Por exemplo, eu gostaria de cortar o arquivo até a posição 56. Então eu gostaria de manter tudo da posição 1-56, e deletar tudo da posição 57 (incluindo 57) até o final da linha para TODAS as linhas.

Arquivo de texto:

Web Application - http://sharepoint

Url                                                     CompatibilityLevel
---                                                     ------------------
http://sharepoint                                       15
http://sharepoint/sites/appcatalog                      15
http://sharepoint/sites/devtest                         15
http://sharepoint/sites/publishing                      15

Eu posso obter mais ou menos os resultados que quero usando o awk:

$awk '{print $1}' file

Resultados:

Web

Url
---
http://sharepoint
http://sharepoint/sites/appcatalog
http://sharepoint/sites/devtest
http://sharepoint/sites/publishing

Mas diga que quero dividir os cabelos e realmente quero manter o título. Como tecnicamente posso cortar este arquivo até a posição 56 usando o vim. De preferência dentro do vim. Significado eu tenho o arquivo aberto no vim.

    
por jes516 13.03.2017 / 16:36

3 respostas

4

Existem muitas maneiras de fazer isso, aqui estão algumas delas:

  1. :%s/\%>56c.//g
  2. :%s/\%57c.*//
  3. :%s/\v^.{56}\zs.*//
  4. :% normal 57|D (este assume virtualedit=all ou virtualedit=onemore )
  5. Shift-g 57 | Ctrl-v 1 Shift-g < kbd> End x (este assume virtualedit=all )

Editar: Adicionando as regurgitações relevantes do manual, conforme solicitado:

  • Para 1. e 2. ( :h /\%c ):

    \%23c Matches in a specific column.
    \%<23c Matches before a specific column.
    \%>23c Matches after a specific column.
    These three can be used to match specific columns in a buffer or string. The "23" can be any column number. The first column is 1. Actually, the column is the byte number (thus it's not exactly right for multi-byte characters).

  • Para 3. ( :h \zs ):

    \zs Matches at any position, and sets the start of the match there: The next char is the first char of the whole match.

  • Para 4. ( :h | , :h D , :h :normal , :h :% , :h 'virtualedit' ):

    | To screen column [count] in the current line. exclusive motion. Ceci n'est pas une pipe

    ["x]D Delete the characters under the cursor until the end of the line and [count]-1 more lines [into register x]; synonym for "d$".

    :norm[al][!] {commands} Execute Normal mode commands {commands}. This makes it possible to execute Normal mode commands typed on the command-line. {commands} are executed like they are typed.

    % equal to 1,$ (the entire file)

    'virtualedit' A comma separated list of these words:
    block Allow virtual editing in Visual block mode.
    insert Allow virtual editing in Insert mode.
    all Allow virtual editing in all modes.
    onemore Allow the cursor to move just past the end of the line

    Virtual editing means that the cursor can be positioned where there is no actual character. This can be halfway into a tab or beyond the end of the line. Useful for selecting a rectangle in Visual mode and editing a table.

  • Para 5. ( :h G , :h CTRL-V , :h <End> , :h x ):

    G Goto line [count], default last line, on the first non-blank character linewise.

    [count]CTRL-V Start Visual mode blockwise.

    $ or <End> To the end of the line.

    ["x]x Delete [count] characters under and after the cursor [into register x] (not linewise). Does the same as "dl".

por 13.03.2017 / 17:11
4

Supondo que "posição" significa "coluna", pode-se usar uma expressão regular

:%s/^\v(.{56}).*//

O que diz que desde o início da linha ^ é mais parecido com Perl ( \v , magic) corresponde a nada . 56 vezes salvando essas coisas (parens), .* para corresponder ao resto da linha ; substitua a linha por ou o que foi salvo pelos parêntesis.

Você também pode chamar mais ou menos awk , a menos que os filtros sejam ilegais por algum motivo:

:%!awk '{print $1}'
    
por 13.03.2017 / 16:47
0

No vim, para {print $1} para tudo, exceto o título, tente:

:2,$s/ .*// 
    
por 13.03.2017 / 19:07

Tags