正则表达式在 shell 中工作,但不能通过 Perl 脚本工作

正则表达式在 shell 中工作,但不能通过 Perl 脚本工作

我在使用 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.

相关内容