0

我有一个文件数组:

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

我需要转义,它将包含“(”和“)”以及通常的空格。

这是@plistFiles 将返回的文件路径之一:

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

如果您需要转义空格以及 ()s 然后

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

要将例如转换(13)\(13\),您可以编写:

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

但我认为你最好只转义and的所有实例,无论它们是否围绕数字:()

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