【问题标题】:Replace "/" by "\/" in a string Perl将字符串中的“/”替换为“\/” Perl
【发布时间】:2019-01-15 12:14:48
【问题描述】:

大家好!

文字

我的脚本有一点问题。我想用\/ 替换变量中的/。这是一个解释:

我有一个变量:

$LAN = GigabitEthernet0/0.20

但是当我在 regex 中使用这个变量时,/ 是个问题。所以我想把GigabitEthernet0/0.20改成GigabitEthernet0\/0.20。

我试过这个:$LAN =~ s/FIND/REPLACE/ig;,但由于所有/,它不起作用。我也试过$LAN =~ m///\//ig;

澄清

我正在路由器上执行命令show arp。这是结果的格式:

Internet 192.168.1.1 34 99gg.zz23.atx2 ARPA GigabitEthernet0/0.20

我使用正则表达式提取设备的 IP 地址:(\d+.\d+.\d+.\d+).*ARPA\s+$LAN,显然它与GigabitEthernet 0/0.20 不匹配,因为/。这就是为什么我想把它变成\/。

提前感谢:)

如果您对我的正则表达式有其他建议,请随时告诉我。

【问题讨论】:

    标签: regex perl text scripting


    【解决方案1】:

    quotemeta() 函数将接受一个字符串并返回它,以便正则表达式引擎使用的所有特殊字符都被正确转义。

    例如。

    $lan = quotemeta('GigabitEthernet0/0.20');
    

    $lan 现在是GigabitEthernet0\/0\.20

    【讨论】:

    • AChichi,你也可以在你的正则表达式中使用\Q和\E而不是quotemeta,就像这样:/(\d+.\d+.\d+.\d+).*ARPA\s+\Q$LAN\E/
    【解决方案2】:

    问题是您需要转义出现在正则表达式中的所有斜杠。因此,当您有以下 FIND 是 / 并且 replace 是 \/

    s/FIND/REPLACE/ig
    

    你不能直接把它们放进去——你需要逃避它们。而且您还需要转义转义反斜杠。于是就变成了

    s/\//\\\//ig
    

    它看起来很丑陋,被称为Leaning Toothpick Syndrome。

    但是您不需要这样做,因为您可以更改在 s/// 或 m// 等中用于分隔的字符...就像这个示例一样,尽管您仍然需要转义反斜杠。

    s%/%\\/%ig
    

    【讨论】:

    • 完美!谢谢
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2018-06-26
    • 2014-10-06
    • 1970-01-01
    • 2020-07-23
    • 2022-01-08
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多