2012-10-25 45 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