regexp search e replace for bash variables

0

Vários scripts do meu bash precisam ser arrumados antes de enviá-los. Uma das coisas que gostaria de fazer é usar chaves para todos os nomes de variáveis. Então, em todos os lugares, diz que $PWD deve ser alterado para ${PWD} et cetera.

Como teste, uso o código

PATH=${PWD}
PATH_PATH=$PATH
PATH_PATH_PATH=$PATH_PATH

Minha ideia era usar a pesquisa de regexp e substituir em emacs . A melhor expressão que encontra todos os meus nomes de variáveis (com CTRL-ALT-S) é $[A-Za-z0-9_\-]* , portanto, uma sequência de 'a' a 'z', 'A' a 'Z', '0' a '9', sublinhado ou hífen após um '$'. Além disso, ele deixa os nomes de variáveis já preparados sozinho.

Agora substitua:
No manual, diz-se que a substituição é 'M-% string RET newstring RET'. No meu computador, 'M-%' é 'ESC-%'. A substituição de Regexp é dada como 'C-M-% regexp RET newstring RET'. Eu acho que seria C-ESC-% para mim? Infelizmente, esse também é o atalho para o monitor 'atividade do sistema' no KDE.

Eu tenho 2 perguntas agora:

  1. existe outra maneira de invocar a expressão regular do que C-ESC -%
  2. para o exemplo acima, qual deve ser a expressão para 'newstring'?
por alle_meije 12.05.2016 / 09:48

1 resposta

1

Eu usaria o regexp [$]\([a-zA-Z0-9_-]+\) e a string de substituição ${} . Aqui está uma explicação para minhas alterações no seu regexp:

  • O caractere $ corresponde à posição "fim de linha", portanto, é necessário escapá-lo quando corresponder a um literal $ . Usar [$] em vez de \$ é uma questão de gosto (e reduz as barras invertidas que podem precisar ser escapadas se você quiser traduzir isso para elisp).

  • Você não precisa fazer escape da barra invertida - dentro da alternativa do personagem, e na verdade você não pode; Incluindo a barra invertida apenas coincide com barras invertidas também. De o manual :

    As a ‘\’ is not special inside a character alternative, it can never remove the special meaning of ‘-’ or ‘]’. So you should not quote these characters when they have no special meaning either. This would not clarify anything, since backslashes can legitimately precede these characters where they have special meaning, as in ‘[^\]’ (‘"[^\]"’ for Lisp string syntax), which matches any single character except a backslash.

    Mas - será igual a si mesmo quando usado dentro de uma alternativa de caractere, desde que não possa ser interpretado como parte de um intervalo. Para estar seguro, coloque primeiro ou por último.

  • Acho que você não deseja corresponder a um $ solitário, portanto, use + em vez de * . Provavelmente não é um grande negócio, no entanto.

  • Por fim, é necessário agrupar o nome da variável em \( \) para que você possa referenciá-lo na string de substituição (como ).

Quanto à sua segunda pergunta, você tem várias opções:

  • A opção mais direta é ESC C-% . Note que ESC não é uma tecla modificadora, é uma chave de prefixo.

  • Você poderia usar o fato de o Emacs interpretar ESC e C-[ de forma idêntica e usar C-[ C-% .

  • Você poderia invocar o comando pelo nome como M-x query-replace-regexp .

  • Ou você pode vincular o comando a uma chave mais conveniente em sua configuração pessoal.

por 12.05.2016 / 20:37