在perl中插入一个字符串中间行

时间:2013-03-25 19:24:22

标签: regex perl

所以我试图弄清楚如何将字符串附加到文件中间出现的字符串的末尾,并在其间有变量。实现这一目标的最佳方法是什么?

示例字符串

depends = object_OBJA object_OBJB place_PLACEA place_PLACEB

我想要归来的

depends = object_OBJA object_OBJB place_PLACEA[RANGE] place_PLACEB[RANGE]

我尝试过使用正则表达式,但我似乎无法跳过PLACEA部分。

我试过的一些例子。我似乎无法弄清楚如何在不直接替换的情况下保留PLACEA。理想情况下,我可以让它找到这个地方,跳过_PLACEA然后追加[RANGE],但它似乎只是替换整个字符串。

perl -p -e 's/place.+?/[$"RANGE"]/ge' test.ctl

3 个答案:

答案 0 :(得分:3)

\K正则表达式运算符可能对您有意义:它“忘记”它与之前的模式匹配。这对于替换非常有用,因为我们可以断言某个模式匹配,但实际上并不替换匹配的文本。这比查找断言更方便。

这会让你替换:

s{ place_\w+ \K }
 {[RANGE]}xg;

测试:

my $string   = "depends = object_OBJA object_OBJB place_PLACEA place_PLACEB";
my $expected = "depends = object_OBJA object_OBJB place_PLACEA[RANGE] place_PLACEB[RANGE]";

use Test::More;
(my $altered = $string) =~ s{ place_\w+ \K }{[RANGE]}xg;
ok $altered eq $expected, "correct substitution";

注意:

  • 我使用\w+来匹配place_字的其余部分。这可能会或可能不会做你想要的。您必须考虑完全要插入[RANGE]的位置。
  • 使用\K可能比使用捕获更有效。

答案 1 :(得分:0)

也许是这样的:

$line =~ s/^(depends = object_OBJA object_OBJB place_PLACEA) (place_PLACEB)$/$1\[RANGE] $2\[RANGE]/

假设您想匹配上面的文字字符串。

未测试

答案 2 :(得分:0)

#!/usr/bin/env perl

use 5.012;
use strict;
use warnings;

my $s = 'depends = object_OBJA object_OBJB place_PLACEA place_PLACEB';
$s =~ s/(place_PLACE.)/${1}[RANGE]/g;

say $s;

输出:

depends = object_OBJA object_OBJB place_PLACEA[RANGE] place_PLACEB[RANGE]