perl -pe 's/".*?"/do{$a = $&; $a =~ s: +:,:g; $a}/ge;'
Essencialmente, este é apenas um substituto de regex global s/regex/replacement/g .
A regex é ".*?" , corresponde a todas as subseqüências que começam com " e termina com a próxima sequência " .
As partes complicadas são:
- A substituição não é uma string, mas uma expressão que é avaliada.
(Esse é o significado do modificador
eapósg.) - A expressão que é avaliada é novamente um substituto de regex global
s:regex:replacement:gque substitui qualquer sequência não vazia de espaços por uma vírgula. (Não podemos usar o mesmo delimitador como na substituição externa, por isso usamos:em vez de/.) - Para executar a substituição do regex interno, temos que atribuir a subsequência correspondente do substituto externo
$&a outra variável$a, executar a substituição interna em$ae, finalmente, imprimir$a.
Com uma versão perl suficientemente recente, a atribuição a uma variável auxiliar pode ser evitada. Usando o modificador r , a substituição interna pode ser executada diretamente em uma cópia da substring combinada $& (graças a Stéphane Chazelas):
perl -pe 's/".*?"/$&=~s: +:,:gr/ge;'