Perl中的模式匹配语法如下......
$ctr01 += s/bin/bash/gi;
这将用bash替换bin。但是如果我想要替换的字符串中有正斜杠,我该怎么写呢?
如何将“/ bin / sh”替换为“/ bin / bash”,因为正斜杠会因我的语法而混乱。
答案 0 :(得分:2)
您可以使用其他正则表达式分隔符,例如#
,或几乎您选择的任何内容:(This tutorial shows some additional examples with the m
operator; you can use this with s
also。)
$ctr01 =~ s#/bin/sh#/bin/bash#gi;
或者,您可以转义斜杠:
$ctr01 =~ s/\/bin\/sh/\/bin\/bash/gi;
答案 1 :(得分:1)
您使用反斜杠“转义”正斜杠 - 或者更改分隔符(s
之后的第一个字符不必是/
,它可以是您选择的任何内容)
答案 2 :(得分:0)
由于您要替换的内容是在路径和字符串的末尾,您可以使用$
来锚定它以进行替换,而不用担心斜杠:
use strict;
use warnings;
my $ctr01 = '/bin/sh';
$ctr01 =~ s/sh$/bash/;
print $ctr01;
输出:
/bin/bash
答案 3 :(得分:0)
$ctr01 += s/bin/bash/gi;
这将用bash替换bin。
不,实际上它会给你一个警告
Argument "/bash/bash" isn't numeric in addition (+)
并返回1
(替换的返回值)。您正在使用的运算符是assignment operator +=
,它是右手递增左手参数的简写,例如$foo += $bar
是$foo = $foo + $bar
的简写。您想要的是=~
,即binding operator。
另外,用“bash”替换“bin”并不是你想要的。你想用“bash”替换“sh”。
克服替换运算符的分隔符很简单,因为您可以使用您喜欢的任何标点符号。您需要确保仅替换您要替换的内容,但是:
$crt01 =~ s#/bin/sh#/bin/bash#g
您可能不需要/i
修饰符,因为路径区分大小写。
答案 4 :(得分:0)
为搜索模式和替换模式声明标量变量。
$search="/bin/sh";
$replace="/bin/bash";
if (/$search/gi) {
s/$search/$replace/gi;
}