正規表現はシェルでは機能しますが、Perl スクリプトでは機能しません

正規表現はシェルでは機能しますが、Perl スクリプトでは機能しません

Perlsystemコマンドを使用して Unix シェルから 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 シェル ( の前のバックスラッシュなし$) を通じて機能します。

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.

関連情報