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
e
apósg
.) - A expressão que é avaliada é novamente um substituto de regex global
s:regex:replacement:g
que 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$a
e, 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;'