usando vims padrão-multi-itens {n} para coincidir com o quinto espaço em uma linha

2

Com esta entrada do nosso crontab

1 3 1 * * find /var/log/tomcat/* -mtime +61 -type f -delete

Eu quero combinar o char de espaço 5 para que eu possa separar a parte de comando da parte do campo de tempo. O Cron pode ter diferentes formatos, então eu quero ser capaz de igualar o DOW como sun ou 0.

A expressão regular que estou usando no vim que corresponde ao primeiro espaço é substituída por "T".

:g/\*/s/\(\ \)\{1\}/T/

O que eu estou perdendo para combinar com o enésimo ou quinto espaço. Isso não faz nada

:g/\*/s/\(\ \)\{5\}/T/

Eu quero gerar uma quebra de quando os comandos são executados no cron para tentar equilibrar a carga em nossos servidores.

Adendo

Eu entendo o que estava fazendo de errado com as pesquisas / substituições acima.

(\ \)\{5\}

Isso é expandido para cinco espaços um após o outro e não o quinto espaço, pois há caracteres entre os espaços.

Este trabalho até o quinto espaço, mas a substituição "\ 1" não inclui o todo do átomo correspondente.

:g/*/s/\([0-9A-Za-z*\/,]* \)\{5}/ T /

deixa o seguinte após a substituição.

*  T find /var/log/tomcat/* -mtime +61 -type f -delete

Estou procurando

1 3 1 * * T find /var/log/tomcat/* -mtime +61 -type f -delete
    
por nelaaro 31.07.2012 / 12:52

3 respostas

2
:g/\*/s/\(\ \)\{5\}/T/

Isso não funciona como você quer, já que diz "substitua cinco espaços consecutivos por T" pelo Vim.

Este comando deve funcionar como você precisa:

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+/T/

Veja :help /\v se você não sabe o que é o modo "muito mágico".

    
por 31.07.2012 / 13:35
1

O comando SedS sugerido por Andreas e Andy é bem adequado para essa coisa:

:line1,line2SedS/ \+/ T /5
    
por 31.07.2012 / 13:46
0

Este grep regex corresponde da maneira que eu espero e substitui o jeito que eu quero.

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"";""/

1 3 1 * * find /var/log/tomcat/* -mtime +61 -type f -delete

"1 3 1 * *";"find /var/log/tomcat/* -mtime +61 -type f -delete"

Graças a xaizeks answer.

Usando: bufdo no vim eu posso editar todos os arquivos que eu abri fazendo os substitutos que quero e finalmente "| w" salvando eles. Então todas as 10 cópias que eu tenho dos nossos cron jobs nos servidores estão prontas para serem separadas.

:bufdo g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"";""/|w
    
por 31.07.2012 / 14:02