Regex funciona no shell mas não no script Perl

2

Estou tendo problemas para executar um script Perl através do shell Unix usando o comando system do Perl.
Eu tive comandos de regex mais complexos que tive que ajustar de acordo para converter de Unix para Perl, e eles estão funcionando bem, mas eu não consigo descobrir o que está faltando aqui. Eu testei com Mobaxterm v7.1 e Putty 0,60.

Eu tenho um arquivo ( file.txt ):

23445 dir1/dir2/dir3
21343 dir1/dir2/dir3/dir4/file.B2
54322 dir1/dir2/dir3/file3.P
53223 dir1/dir2/dir3/dir4/dir5
23412 dir1/dir2/dir3/dir4/dir5/file5.xsd
54166 dir1/dir2/file6.AB
64544 dir1/dir2/fil7.ABE

A partir deste arquivo eu estou tentando grep apenas as linhas com arquivos (excluir diretórios: linhas 1 e 4), e armazená-los em um novo arquivo:

system("grep '^.*\.[a-zA-Z0-9][a-zA-Z0-9]*\$' file.txt > file2.txt");

file2.txt não muda de file.txt e ainda contém os diretórios.

No entanto, este comando funciona através do shell Unix (sem a contrabarra antes do $ ):

grep '^.*\.[a-zA-Z0-9][a-zA-Z0-9]*$' file.txt > file2.txt

file2.txt output:

21343 dir1/dir2/dir3/dir4/file.B2
54322 dir1/dir2/dir3/file3.P
23412 dir1/dir2/dir3/dir4/dir5/file5.xsd
54166 dir1/dir2/file6.AB
64544 dir1/dir2/fil7.ABE

Eu tenho que escapar do caractere $ no comando do sistema Perl, claro, para que o Perl não o leia como uma string desconhecida. Fora isso, o que precisa ser ajustado no comando do sistema?

    
por lkisac 06.10.2014 / 17:09

1 resposta

2

Nas aspas duplas, é necessário inverter as barras invertidas, ou seja, dobrar a barra invertida antes do ponto.

system("grep '^.*\.[a-zA-Z0-9][a-zA-Z0-9]*\$' file.txt > file2.txt");
#                ^
#                |
#              Here.
    
por 06.10.2014 / 17:15