Regex funciona em shell, mas não através de script Perl

Regex funciona em shell, mas não através de script Perl

Estou tendo problemas para executar um script Perl através do shell Unix usando o systemcomando Perl.
Tive comandos regex mais complexos que tive que ajustar de acordo para converter de Unix para Perl, e eles estão funcionando bem, mas não consigo descobrir o que está faltando aqui.
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 estou tentando grepapenas as linhas com arquivos (excluir os 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.txtnão muda file.txte ainda contém os diretórios.

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

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

file2.txtsaída:

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?

Responder1

Entre aspas duplas, você precisa usar 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.

informação relacionada