![Convertendo entre uma substituição do vim e uma substituição da torta perl](https://rvso.com/image/1316127/Convertendo%20entre%20uma%20substitui%C3%A7%C3%A3o%20do%20vim%20e%20uma%20substitui%C3%A7%C3%A3o%20da%20torta%20perl.png)
Então eu tenho um arquivo test.txt, que contém,
home -> range
Se eu editar o arquivo no vim e executar o comando, %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
ele converte o arquivo para
range ::= home ;
que é o que eu quero. No entanto, se eu correr
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
que acho que deveria fazer o mesmo, não recebo nenhuma alteração - alguém pode me dizer o que deu errado? Suspeito que algo precisa ser escapado, mas lancei todos os tipos de combinações de fuga nisso... além disso, gostaria de algumas regras gerais sobre a conversão entre os dois formatos...
Responder1
Em Perl você não escapa dos colchetes de captura, também é convencional usar $1,$2 em vez de \1,\2 para as variáveis de captura.
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
É um facto infeliz da vida que oexpressões regulares(RE) usados em muitas ferramentas comuns (vim, sed, awk, perl) são todos sutilmente diferentes. Algumas ferramentas têm a opção de usar REs Perl, REs básicos POSIX (BRE) ou REs estendidos POSIX (ERE).
perldoc perlre
tem isto a dizer sobre $1
vs \1
na parte de substituição de uma expressão de substituição
Algumas pessoas se acostumam demais a escrever coisas como:
$pattern =~ s/(\W)/\\\1/g;
Isso é uma garantia do RHS de um substituto para evitar chocar os viciados em drogas, mas é um hábito sujo de se adquirir. Isso ocorre porque no PerlThink, o lado direito de um "s///" é uma string entre aspas duplas. "\1" na string usual entre aspas duplas significa um controle-A. O significado habitual do Unix de "\1" é substituído por "s///". No entanto, se você adquirir o hábito de fazer isso, terá problemas se adicionar um modificador "/e".