如何模式匹配并将“/ bin / sh”替换为“/ bin / bash”

时间:2013-12-10 03:25:45

标签: perl

Perl中的模式匹配语法如下......

$ctr01 += s/bin/bash/gi;

这将用bash替换bin。但是如果我想要替换的字符串中有正斜杠,我该怎么写呢?

如何将“/ bin / sh”替换为“/ bin / bash”,因为正斜杠会因我的语法而混乱。

5 个答案:

答案 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;
}