Alterando um valor numérico em um arquivo com o Vim de um script

1

Eu preciso alterar o valor numérico de uma variável armazenada em um arquivo de texto na linha de comando.

Eu tentei criar um script com o Bash, mas só cheguei até agora:

#!/bin/bash
clear
vim The_Generator.c

(This is hopefully where I modify the The_Generator.c file).

-c 'wq'
    
por RedandBlue 05.07.2017 / 00:47

1 resposta

1

O Vim não é a melhor maneira de fazer isso, mas é possível:

$ vim -c '%s/^\(VARIABLE=\)\d\+//' -c wq The_Generator.c

%s significa "pesquisar e substituir globalmente" no Vi. O padrão de busca procura por uma linha começando com VARIABLE= seguido por um ou mais dígitos ( \d+ ), então substitui o (s) dígito (s) por 3 , o novo valor da variável que eu escolhi para o bem do exemplo aqui. A parte VARIABLE= é colocada de volta na linha com a referência de retorno .

Existem vários pontos fracos que tornam isso insatisfatório:

  1. O Vim é um programa bastante pesado para uma tarefa simples como essa. Observe que você obtém um breve flash da interface vi de tela inteira ao fazer isso. Isso é um desperdício; podemos fazer melhor.

  2. O Vim não é tão amplamente implantado quanto as alternativas abaixo, e estamos usando pelo menos três recursos do Vim que provavelmente não existirão nos sabores mais tradicionais do Vi, como Berkeley nvi ou Solaris vi : referências anteriores, \d em expressões regulares e vários -c sinalizadores.

  3. Como o Vim não é voltado para esse tipo de problema, precisamos da opção explícita "salvar e sair" aqui ( -c wq ), que é mais brevemente expressa nas alternativas abaixo.

Uma opção mais eficiente e mais portátil é usar sed :

$ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*//' The_Generator.c

Se você estiver em um sistema em que possa usar POSIX expressões regulares estendidas em sed via -E , você pode tornar o comando mais curto que o equivalente do Vim:

$ sed -E -i -e 's/^(VARIABLE=)[0-9]+//' The_Generator.c

Isso nos permite descartar várias barras invertidas e expressar o bit "um ou mais dígitos" mais compactamente.

Se a eficiência não é primordial, você pode obter um poder mais expressivo com o Idioma de torta de Perl :

$ perl -pi -e 's/^(VARIABLE=)\d+/${1}3/' The_Generator.c

Ele é mais curto que a alternativa sed -E porque os regexes Perl são ainda mais poderosos que os REs estendidos POSIX.

A maior diferença aqui está no modo como o Perl lida com referências anteriores. Você normalmente atribui a eles a sintaxe $NUM em vez de \DIGIT , mas colocamos o número entre chaves aqui para separá-lo do texto de substituição, pois ele também é um número. Sem os colchetes, o Perl iria procurar a referência de referência # 13, não encontraria nenhum texto correspondente e, portanto, deixaria de fazer o que quisesse.

Algumas pessoas gostam do Awk para esse tipo de coisa, mas eu não consegui inventar uma expressão que exercesse seu próprio peso sendo mais curta que a opção sed enquanto era mais rápida que a opção Perl.

    
por 05.07.2017 / 01:03