Por que isso adiciona espaços? eco “x axe” | sed 's / x \ s * / x /'

4

Eu quero encontrar um x e substituir o 0 ou mais espaços seguintes ( \s* ) por um único espaço.

echo "x ax" | sed 's/x\s*/x /'

Por algum motivo, em vez de substituir os espaços pelo espaço único, basta anexar um espaço a quantos já existiam antes:

x  ax

O uso de + em vez de * parece absolutamente nada, independentemente do meu uso do sinal -E .

Parece que sed não faz expressões não-vorazes, então por que esse * não consome todos os espaços ao combinar?

Sou um ninja regex em configurações não-bash, mas o bash e suas ferramentas me alimentam vivo. Eu não tenho ideia de como concisamente frase isso para uma consulta de mecanismo de pesquisa bem-sucedida.

    
por Tim 06.02.2013 / 00:36

2 respostas

12

sed espera uma expressão regular básica (BRE). \s não é uma construção especial padrão em um BRE (nem em um ERE , para esse assunto), esta é uma extensão de algumas línguas, em particular Perl (que muitos outros imitam). No sed, dependendo da implementação, \s representa a string literal \s ou o caractere literal s .

Em sua implementação, parece que \s corresponde a s , então \s* corresponde a 0 ou mais s e x\s* corresponde a x em sua entrada de amostra, portanto x ax é transformado em x ax (e xy seriam transformados em x y e assim por diante). Em outras implementações (por exemplo, com o GNU sed), \s corresponde a \s , então \s* corresponde a uma barra invertida seguida por 0 ou mais s , o que não ocorre na sua entrada, portanto a linha permanece inalterada. p>

Isso não tem absolutamente nada a ver com ganância. A ganância não influencia se uma string corresponde a um regex, apenas qual parte da string é capturada por uma correspondência.

    
por 06.02.2013 / 01:23
1

Acho que você está misturando as bandeiras sed e grep. -E é o sinalizador grep para expressões regulares estendidas. -r é o sinalizador sed para expressões regulares estendidas. O seguinte funciona para mim:

echo "x     ax" | sed -r 's/x\s*/x /'

Produz

x ax
    
por 06.02.2013 / 00:58