转义通配符文件路径perl

时间:2012-10-25 21:51:42

标签: regex perl escaping

我有一系列文件:

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

我需要逃避,它将包含'('和')'以及通常的空格。

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

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

我目前有这个代码用于转义文件路径中的空格,我将其传递给OSX中终端中的命令:

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

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

这对于转义(和)来说是否正确?:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用正则表达式,您可以使用

添加转义斜杠
s/[() ]/\\$&/g;

请参阅 this demo

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

请参阅 this demo

答案 2 :(得分: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;

答案 3 :(得分:-1)

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

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

但我认为你可能最好只是逃避()所有实例,无论它们是否包围数字:

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