Regex работает в оболочке, но не через скрипт Perl

Regex работает в оболочке, но не через скрипт Perl

У меня возникли проблемы с выполнением скрипта Perl через оболочку Unix с помощью команды Perl system.
У меня были более сложные команды регулярных выражений, которые мне пришлось соответствующим образом скорректировать для преобразования из Unix в Perl, и они работали нормально, но я не могу понять, чего здесь не хватает.
Я тестировал с Mobaxterm v7.1 и Putty 0.60.

У меня есть файл ( 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

Из этого файла я пытаюсь взять grepтолько строки с файлами (исключая каталоги: строки 1 и 4), и сохранить их в новом файле:

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

file2.txtне изменяется file.txtи по-прежнему содержит каталоги.

Однако эта команда работает через оболочку Unix (без обратной косой черты перед $):

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

file2.txtвыход:

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

Мне нужно экранировать $символ в системной команде Perl, конечно, чтобы Perl не читал его как неизвестную строку. Помимо этого, что нужно изменить в системной команде?

решение1

В двойных кавычках необходимо использовать обратную косую черту, т.е. удваивать обратную косую черту перед точкой.

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

Связанный контент