2012-10-25 47 views
0

我有文件的数组:逃逸通配符文件路径perl的

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

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

以下是文件路径之一@plistFiles将返回:

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

我现在有一个转义文件路径的空间,我传递给命令在码头OSX验证码:

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

那么如何编辑这个正则表达式也逃脱(和)?

这是否是正确的只是逃避(和)?:

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

用什么你想替换“和”? –

+0

@sputnick我不想“替换”,但只是逃避字符 – stackErr

+0

你想要什么“逃避”和为了什么目的?所有'('和')',还是只有那些数字?空间也是?其他元字符? – pavel

回答

-1

要转换例如(13)\(13\),你可以写:

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

但我认为你可能会更好过刚刚逃离()所有情况下,他们是否围绕数字:

$plistFile =~ s/([()])/\\$1/g; 
+0

我只是想了解你的最后一行代码,纠正我,如果我错了,但这意味着:任何'()'的实例将被替换为\ \(\)'? – stackErr

+0

@ user1160022:这意味着任何空格,左括号或右括号都将被替换为反斜杠加上自身。 (它为'[character-class] [http://www.regular-expressions.info/charclass.html]使用'[...]'符号,[capture]的'(...)'符号-group](http://www.regular-expressions.info/brackets.html),以及特殊变量'$ 1'来检索第一个捕获组的内容。) – ruakh

+0

@Ωmega:这不是必需的,但是使用'$&'对整个程序中的其他任何地方的所有正则表达式匹配都会造成性能损失。这种惩罚通常不值得失去睡眠,但在StackOverflow答案的情况下,当我甚至不知道程序在做什么时,我宁愿避免它。另外,我认为'$ 1'比'$&'稍微更清晰,因为(几乎所有)类似Perl的正则表达式引擎都采用了'$ 1',但几个主要的引擎并未采用'$&'。 (顺便说一下,一个挑剔的问题:正确地说,如果我在模式中使用了类似'\ 1'的东西,那么就是“反向引用”。) – ruakh

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; 
+0

你的第一段对我没有意义。如果模式或替换包含'/',使用'{} {}'而不是'///'将只保存反斜杠 - 这里不是这种情况。 – ruakh

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 
+0

我正在学习perl,并不知道quotemeta,但我有一些正则表达式的经验,所以我用这种方法 – stackErr

1

使用正则表达式,您可以添加逃生与

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

斜线见this demo

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

this demo

+0

感谢您的演示链接! – stackErr