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