Regex funciona en Shell pero no a través del script Perl

Regex funciona en Shell pero no a través del script Perl

Tengo problemas para ejecutar un script de Perl a través del shell de Unix usando systemel comando de Perl.
Tuve comandos de expresiones regulares más complejos que tuve que ajustar en consecuencia para convertir de Unix a Perl, y están funcionando bien, pero parece que no puedo entender qué falta aquí.
Lo probé con Mobaxterm v7.1 y Putty 0.60.

Tengo un archivo ( 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

De este archivo, estoy intentando grepsolo las líneas con archivos (excluir directorios: líneas 1 y 4) y almacenarlas en un archivo nuevo:

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

file2.txtno cambia file.txty todavía contiene los directorios.

Sin embargo, este comando funciona a través del shell de Unix (sin la barra invertida antes de $):

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

file2.txtproducción:

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

Por supuesto , tengo que escapar del $carácter en el comando del sistema Perl para que Perl no lo lea como una cadena desconocida. Aparte de eso, ¿qué se debe ajustar en el comando del sistema?

Respuesta1

Entre comillas dobles, debe colocar barras invertidas, es decir, duplicar la barra invertida antes del punto.

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

información relacionada