0

私はファイルの配列を持っています:

my @plistFiles = glob('Logs/*/*.plist');

エスケープする必要があります。これには、通常のスペースだけでなく、「(」と「)」も含まれます。

@plistFilesが返すファイルパスの1つは次のとおりです。

Logs/Run 1 (13)/Automation Results.plist

私は現在、OSXのターミナルのコマンドに渡すファイルパスのスペースをエスケープするための次のコードを持っています:

$plistFile =~ s/\ /\\\ /g;

では、この正規表現を編集して(および)もエスケープするにはどうすればよいですか?

これは(と)をエスケープするためだけに正しいでしょうか?:

$plistFile =~ s/\(\d)/\\\(\d\\\)/g;
4

4 に答える 4

1

quotemetaの呼び出しが十分でない理由がわかりません。はい、スラッシュとドットもエスケープしますが、それは問題ではありません。

ただし、空白と括弧だけをエスケープするのも簡単です。

このプログラムは両方のテクニックを示しています

use strict;
use warnings;

use feature 'say';

my $path = 'Logs/Run 1 (13)/Automation Results.plist';
my $escaped = quotemeta $path;
say $escaped;

$escaped = $path =~ s/([\s()])/\\$1/gr;
say $escaped;

出力

Logs\/Run\ 1\ \(13\)\/Automation\ Results\.plist

Logs/Run\ 1\ \(13\)/Automation\ Results.plist
于 2012-10-25T22:44:53.063 に答える
1

正規表現を使用すると、でエスケープスラッシュを追加できます

s/[() ]/\\$&/g;

このデモを参照してください。

また

s/(?=[() ])/\\/g;

このデモを参照してください。

于 2012-10-25T22:53:30.597 に答える
0

{}を使用して正規表現を区切る方が簡単です。いくつかの\目のぐらつきを保存します。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use 5.10.0;
use Data::Dumper;

my $to_match = "( this dreadful ) filename";
$to_match =~ s{([\(\)])}{\\$1}g;
say $to_match;

これはこれを行います:

$ perl x.pl
\( this dreadful \) filename

スペースと()をエスケープする必要がある場合は、

$to_match =~ s{([\(\s\)])}{\\$1}g;
于 2012-10-25T22:17:10.800 に答える
-1

(13)たとえばをに変換するに\(13\)は、次のように記述できます。

$plistFile =~ s/ /\\ /g;
$plistFile =~ s/\((\d+)\)/\\($1\\)/g;

しかし、数字を囲むかどうかに関係なく、とのすべてのインスタンスをエスケープする方がおそらく良いと思います。()

$plistFile =~ s/([ ()])/\\$1/g;
于 2012-10-25T22:20:00.777 に答える