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

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

Unixシェルを介してPerlスクリプトを実行するための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

二重引用符にはバックスラッシュが必要です。つまり、ポイントの前にバックスラッシュを2倍にします。

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

おすすめ記事