繁体   English   中英

在perl中插入字符串中线

[英]Insert a string mid line in 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

\\K regex运算符可能对您很有趣:它“忘记”它与先前的模式匹配。 这对于替换非常有用,因为我们可以断言某个模式已匹配,但实际上并不替换匹配的文本。 这比环视断言更方便。

这将使您的替换:

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可能更有效。

也许是这样的:

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

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

未经测试

#!/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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM