Como excluir espaços em branco em torno de sinais de igual em uma string?

1

Estou tentando determinar uma maneira de excluir os espaços em branco iniciais e finais em torno do sinal de igual de uma string. O espaço em branco pode (ou não) estar presente. Pode haver 0, 1 ou mais sinais de igual.

Eu tenho tentado usar sed , mas está falhando miseravelmente ao ponto de nem sequer mostrar o que não funcionou. Eu acho que posso estar usando a ferramenta errada para o trabalho. Não acho que sed ou expressões regulares possam ser usadas para esse problema, mas posso estar errado.

Como excluo o espaço em branco entre sinais de igual?

O problema atual é conceitualmente simples. Eu tenho uma única string com zero ou mais opções a=b . Uma opção pode ser fornecida como a=b , a = b ou talvez algo como a= b . Eu preciso normalizá-lo para a=b .

Pode haver casos de canto, como CR e LF , em uma cadeia de várias linhas. Eu não cheguei ao ponto de quebrar o espaço em branco. Se eu conseguir chegar tão longe, então estou inclinado a chamá-lo malformado e rejeitar uma string multilinha.

    
por jww 31.05.2016 / 00:04

3 respostas

3

Já que nem don_crissti nem Julie Pelletier converteram o comentário perfeitamente bom em uma resposta, eis o que Don criou:

sed 's/[[:blank:]]*=[[:blank:]]*/=/g'

... que usa expressões regulares e uma classe de caracteres em sed para atingir o objetivo. O [:blank:] interno captura espaços ou tabulações; o% outer []* diz para capturar zero ou mais desses espaços / tabs; o sinal de igual significa por si mesmo, então a mesma expressão regular é repetida. O espaço em branco (opcional), o sinal de igual e o espaço em branco (opcional) são todos substituídos por um sinal de igual, e o sinalizador g informa sed para repetir essa pesquisa & substituir em todos os jogos na linha.

Exemplo de entrada:

$ cat input
a=b a = b a= b a =b

e saída:

$ sed 's/[[:blank:]]*=[[:blank:]]*/=/g' input
a=b a=b a=b a=b
    
por 31.05.2016 / 03:24
1

Eu faria isso com o emacs:

$x replace-regexp
\s *=\s *
=

em que \s *=\s * é o regexp que identifica qualquer espaço em branco em torno de um sinal de igual e = é o que deve ser substituído por. Geralmente, \sC é interpretado como a classe de caractere C , nesse caso, espaço em branco (podem ser guias também). Se você quer apenas espaços, use * (esse é um espaço antes do *).

Você parece ter uma segunda pergunta, How do I delete whitespace between equal signs? . Nesse caso, você deseja:

$x replace-regexp
=\s *=
==

Eu sempre tenho que re-procurar o sed & awk Se eu puder usá-lo, eu sempre vou ao emacs. No emacs, você deseja usar C-h i para acessar o sistema de informações, seguido de m emacs para obter informações sobre o emacs e, em seguida, apenas pesquisar em regexp nessa página de informações.

    
por 31.05.2016 / 07:05
0

Não mencionado, mas Perl:

s/\s*=\s*/=/g;
    
por 31.05.2016 / 18:32