Shell-Script

正則表達式在 shell 中工作,但不能通過 Perl 腳本

  • October 6, 2014

我在使用 Perl 的system命令通過 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 不會將其讀取為未知字元串。除此之外,系統命令中需要調整什麼?

在雙引號中,您需要反斜杠反斜杠,即雙引號前的反斜杠。

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

引用自:https://unix.stackexchange.com/questions/159624