RegExp: tentando entendê-lo. Ajuda com uma consulta

0

Eu postei 2 vezes agora com problemas de RegExp, então, em vez de postar repetidamente, estou tentando aprender por conta própria. Isso não deu certo, pois estou aqui postando mais uma vez ...

Eu estava fazendo alguns testes e pensei em um que eu possa me ver usando com frequência.

Então, eu tenho alguns arquivos em torno dos quais eu normalmente usaria source , pois eles são comuns em muitas coisas que eu faria. Eu estava tentando modelar isso removendo todas as coisas após o '=' em um par Name=Value . Isso significa que, em vez de:
Foo=Bar
Eu teria:
Foo=
depois que eu terminei usando sed para editar meus arquivos.

Eu tentei criar uma declaração RegExp para fazer isso, apenas remover os valores após o = , mas não consigo criar um que corresponda a um único = e não múltiplo (por exemplo, correspondência = mas não corresponde a ===== )

Este é o mais avançado que consegui antes de decidir postar: s/={1}.*/=/g

Alguém poderia lançar alguma visão? Eu não quero remover vários = , pois esta é a formatação comumente usada para comentários dentro da minha equipe, eles os usam para dividir seções de entrada de dados para facilitar a leitura.

Alguns valores de teste: -

NameOfServer=Foo   
'#'==========  
'#' UserData   
'#'==========

Idealmente, gostaria que correspondesse o '= Foo' na primeira linha, mas não removesse o múltiplo '=' das linhas comentadas.

Nota: Eu estaria usando o Sed (v4.2) (também Sed dentro do Vim para 'encontrar e substituir o padrão' se isso for relevante).

    
por 64Hz 24.05.2018 / 15:20

2 respostas

1

Uma variável é uma cadeia de caracteres que consiste em um caractere [a-zA-Z_] seguido por zero ou vários caracteres [a-zA-Z_0-9] (no código de idioma POSIX / C).

Podemos combinar essas strings que são diretamente seguidas por um = e excluir o restante da linha:

sed 's/\([a-zA-Z_][a-zA-Z_0-9]*=\).*//' file

No seu arquivo de exemplo, isso produzirá

NameOfServer=
'#'==========
'#' UserData
'#'==========
    
por 24.05.2018 / 17:22
1

={1}.* é igual a =.* e corresponderá a um sinal de igual seguido por qualquer quantidade de qualquer caractere. Regexes são geralmente "gananciosos", então eles tentam encontrar a correspondência mais longa. Usar esse padrão contra uma string de sinais de igual corresponderá a toda a string, já que não há como o mecanismo de regex saber que você quis dizer caracteres diferentes de sinais de igual.

Use =[^=]* para corresponder a um sinal de igual seguido por qualquer quantidade de caracteres que não sejam sinais de igual. Ou =[^=].* para corresponder a um sinal de igual, seguido por qualquer outro caractere, seguido por qualquer coisa.

Ou para combinar linhas com atribuições de variáveis mais de perto, algo como

sed -Ee 's/^([a-zA-Z0-9_]+=).*//'

verificaria se a linha se parece com uma atribuição de variável e, em seguida, removerá qualquer coisa depois do = . Isso pressupõe que os nomes das variáveis só podem conter letras, números e sublinhados ingleses. Você pode precisar ajustar isso.

    
por 24.05.2018 / 17:15