-1

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

示例字符串

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
4

3 回答 3

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可能比使用捕获更高效。
于 2013-03-25T19:48:30.520 回答
0

也许是这样的:

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

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

未经测试

于 2013-03-25T19:28:36.583 回答
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;

输出:

依赖 = object_OBJA object_OBJB place_PLACEA[RANGE] place_PLACEB[RANGE]

于 2013-03-25T20:32:47.003 回答