Como substituir várias ocorrências de um padrão por sed

0

Eu uso o seguinte comando para remover espaços adjacentes entre chaves de matriz que são strings ou inteiros em arquivos PHP:

sed -ri "s/\[ ([0-9]+|(\x27|\x22).*(\x27|\x22)) \]/[]/g" file.php

Eu pensei que tinha coberto todas as bases, mas está falhando quando há vários colchetes na mesma linha, então isso:

if ( $myarray[ 'id' ] == 7 && $myarray[ 'status' ] == true )

Torna-se assim:

if ( $myarray['id' ] == 7 && $myarray[ 'status'] == true )

Quando deveria ser assim:

if ( $myarray['id'] == 7 && $myarray['status'] == true )

Ele está removendo o espaço à direita para o primeiro conjunto de colchetes e o espaço à esquerda para o segundo conjunto.

Como posso modificar o comando para que ele substitua os espaços entre todos os colchetes de matriz em cada linha para todo o arquivo?

    
por Andy 15.05.2015 / 22:33

1 resposta

3

Seu problema vem do .* . Se você corresponder apenas a todos os caracteres que não sejam 'ou a', funcionará: sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^\x27\x22]*(\x27|\x22)) \]/[]/g" file.php

Ainda melhor (para ter possível "ou" em conta):

sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^]*()) \]/[]/g" file.php
    
por 15.05.2015 / 22:50