Convertendo entre uma substituição do vim e uma substituição da torta perl

Convertendo entre uma substituição do vim e uma substituição da torta perl

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 ;/gele 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 perlretem isto a dizer sobre $1vs \1na 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".

informação relacionada