我在使用 Perlsystem
命令通过 Unix shell 执行 Perl 脚本时遇到问题。
我有更复杂的正则表达式命令,我必须相应地调整才能从 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 shell 运行(在 之前没有反斜杠$
):
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.