-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_OBJAobject_OBJB place_PLACEA [RANGE] place_PLACEB [RANGE]

于 2013-03-25T20:32:47.003 に答える