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