perl regex \ Q mac os x

时间:2015-11-29 04:40:42

标签: regex macos perl

我正在尝试在os x终端中使用perl进行文本搜索和替换。我正在尝试使用以下行替换一串特殊字符“!@#$%^& *()”和字符串'special characters':

perl -p -e 's/\Q!@#$%^&*()\E/special characters/g' 'hello.txt' > 'hello_new.txt'

但它不起作用。 \ Q不能在OS X上运行吗?它应该禁用正则表达式模式匹配。我不想自己逃避角色。我做错了什么?

2 个答案:

答案 0 :(得分:2)

$ perl -MData::Dump -E 'dd "\Q!@#$%^&*()\E"' "\\!\\\@\\#0\\^\\&\\*\\(\\)" perlvar中的一个特殊变量,正在进行插值。

您只需输出LHS作为字符串即可确认:

$

要解决此问题,只需要在你的正则表达式的LHS中转义perl -pe 's/\Q!@#\$%^&*()\E/special characters/g' 'hello.txt' > 'hello_new.txt'

df=

        c1   c2   c3  ... c750
c1      5    2    5   ...   3 
c2      3    1    5   ...   80
c3      4    2    7   ...   10
.       .    .    .   ...   .
.       .    .    .   ...   .
.       .    .    .   ...   .
c750    8    3    5   ...   1

答案 1 :(得分:2)

perldoc perlreref注意到

  

\Q\E

之前禁用模式元字符

但似乎$不足以形成模式元字符;它是引入变量引用的所有其他元字符,并且大多数特殊字符与$组合以根据perldoc perlvar创建特殊变量。因此,如果您将其逐字写入正则表达式,即使在$内,也需要转义\Q…\E

或者您可以使用此主题的变体:

$ echo '!@#$%^&*()' |
> perl -l -e '$rx = q{!@#$%^&*()}; $qx = qr/\Q$rx\E/; print $qx;
>             while (<>) { s/$qx/special characters/; print; }'
(?^:\!\@\#\$\%\^\&\*\(\))
special characters
$

第一行输出是正则表达式,您可以在其中看到所有字符(包括$)都使用反斜杠进行转义。第二行表明当时 input是字符串,识别并替换模式。

在Mac OS X 10.11.1 El Capitan上使用自制的Perl 5.22.0和系统提供的Perl 5.18.2进行测试 - 两者的输出相同。而且(自制)Perl 5.8.9为可打印的正则表达式提供了略微不同的输出:

(?-xism:\!\@\#\$\%\^\&\*\(\))

请注意,将其与原始正则表达式相匹配会产生:

$ perl -l -e '$qx = qr/\Q!@#$%^&*()\E/; print $qx'
(?^:\!\@\#0\^\&\*\(\))
$

$%0取代。这是因为$%也称为$PAGE_FORMAT_NUMBER

  

$%
  当前所选输出通道的当前页码   助记符:%是nroff中的页码。