【问题标题】:Perl : Selective string substitutionPerl:选择性字符串替换
【发布时间】:2012-08-01 03:32:45
【问题描述】:

我有一个包含前缀为 A_B_ 的字符串的文本文件。

示例:A_B_Monday

我想用X_Y_* 替换所有出现的A_B_*,除非* 是C

所以所有A_B_* 但不是A_B_C 的字符串都必须替换为X_Y_*

在perl中应该怎么做?

编辑:1 上面的 * 是一个字符串。所以所有不是 A_B_Geneva 的 A_B_* 都应该替换为 X_Y_NewYork。 perl -pi.bak -e 's/^A_B_(!Geneva)/X_Y_/g;' File.Txt 似乎不起作用。我在 Strawberry Perl 上。

更新: 这对我有用 perl -i.bak -pE "s/A_B_(?!Geneva)/USB_EP_/g" File.Txt

【问题讨论】:

  • 正如已经两次指出的那样,A_B_Genevaxxx 将失败

标签: string perl substitution


【解决方案1】:
$line =~ s/^A_B_([^C])/X_Y_$1/;

您应该对文件的每一行都执行此操作。

【讨论】:

    【解决方案2】:

    也许:

    s/^A_B_(?!C)/X_Y_/;
    

    或:

    s/^A_B_(?!C)/X_Y_/i;
    

    【讨论】:

    • 我的命令行程序如下:perl -pi.bak -e "/s/^A_B_(?!Type)/X_Y_/g;"File.Txt 这个不行。
    • perl -i.bak -pE "s/^A_B_(?!C)/X_Y_/" File.txt
    • 这是最接近的。我必须删除 ^ 并应用 /g。非常感谢大家。我正在学习。
    【解决方案3】:
    s/^A_B_(?!Type\z)/X_Y_/;
    

    没有\zA_B_Typed 将不会更改为应有的X_Y_Typed

    你可以这样使用它:

    perl -pi.bak -pe"s/^A_B_(?!Type\z)/X_Y_/g" file
    

    【讨论】:

    • 在我的答案中添加了一条线。
    • ^ 锚使 /g 不必要。
    猜你喜欢
    • 2012-08-11
    • 2020-08-28
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2014-10-06
    • 2022-01-08
    • 2013-03-08
    • 2012-09-21
    相关资源
    最近更新 更多