Conversão entre uma substituição vim e uma substituição de torta perl

0

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/^\(.*\)->\(.*\)$/ ::= ;/g , ele converterá o arquivo para

range ::= home  ;

que é o que eu quero. No entanto, se eu correr

 perl -pi -e 's/^\(.*\)->\(.*\)$/ ::=  ;/g' test.txt

que eu acho que deveria fazer o mesmo, eu não tenho nenhuma mudança - alguém pode me dizer o que está errado? Eu suspeito que algo precisa escapar, mas eu joguei todos os tipos de combinações de escape ... mais eu gostaria de algumas regras gerais sobre a conversão entre os dois formatos ...

    
por Joe 25.05.2012 / 11:02

1 resposta

1

Em Perl você não escapa dos parênteses de captura, também é convencional usar $ 1, $ 2 ao invés de \ 1, \ 2 para as variáveis de captura.

perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt

É um fato lamentável da vida que as regexes (RE) usadas em muitas ferramentas comuns (vim, sed, awk, perl) são todos sutilmente diferentes. Algumas ferramentas têm uma opção para usar Perl REs, POSIX Basic REs (BRE) ou POSIX Extended REs (ERE).

perldoc perlre tem isto a dizer sobre $1 vs na parte de substituição de uma expressão de substituição

Some people get too used to writing things like:

$pattern =~ s/(\W)/\/g;

This is grandfathered for the RHS of a substitute to avoid shocking the sed addicts, but it's a dirty habit to get into. That's because in PerlThink, the righthand side of an "s///" is a double-quoted string. "" in the usual double-quoted string means a control-A. The custom- ary Unix meaning of "" is kludged in for "s///". However, if you get into the habit of doing that, you get yourself into trouble if you then add an "/e" modifier.

    
por 25.05.2012 / 11:11

Tags