我正在尝试在os x终端中使用perl进行文本搜索和替换。我正在尝试使用以下行替换一串特殊字符“!@#$%^& *()”和字符串'special characters':
perl -p -e 's/\Q!@#$%^&*()\E/special characters/g' 'hello.txt' > 'hello_new.txt'
但它不起作用。 \ Q不能在OS X上运行吗?它应该禁用正则表达式模式匹配。我不想自己逃避角色。我做错了什么?
答案 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)
之前禁用模式元字符
\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中的页码。