
У меня возникли проблемы с выполнением скрипта 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.