разбить строку на несколько частей и заменить одну подстроку другой строкой - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь заменить строку подстрокой, которая находится между двумя другими частями.

Для описания у меня есть файл, содержащий некоторый текст. В этом текстовом файле есть одно слово, некоторые части которого написаны разными символами, например:

acc\E34rate
acc\?4rate
acc§54rate
.....

То, что я хочу написать в виде кода, это поиск для acc, а затем rate и затем заменить то, что между ними, на u. Потому что все строки начинаются с первой и последней части.

Интересно, как я могу это сделать в Perl?

Спасибо!

Обновление: включая код

хорошо, что я написал:

use strict;
use warnings;

my @stringArray  = ('acc\E34rate', 'acc\?4rate');
my $find    = '\E34';
my $replace = 'u';  
my @newArray;

    foreach my $str(@stringArray)
    {
        my $pos = index($str, $find);

        while($pos > -1) {
            substr($str, $pos, length($find), $replace);
            $pos = index($str, $find, $pos + length($replace));
        }

        push @newSrray, $str;
    }

    foreach(@newArray)
    {
        print "$_\r\n";
    }

Для упрощения я добавил массив вместо файла. Потому что он работает только для правильного слова, а не для всего массива / файла.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я думаю, это то, что вы хотите, но требования не ясны. Подробнее см. perldoc perlre.

#!/usr/bin/env perl

use strict;
use warnings;

my $begin   = 'acc';
my $end     = 'rate';
my $replace = 'u';

while( my $line = <DATA> ){
    $line =~ s{ \Q$begin\E \S*? \Q$end\E }{$begin$replace$end}gmsx;
    print $line;
}

__DATA__
acc\E34rate
acc\?4rate
acc§54rate
acc\E34rate acc\?4rate acc§54rate
accFOOacc
rateFOOrate
rateFOOrate accFOOacc
accFOOacc rateFOOrate
0 голосов
/ 03 июля 2018

Попробуйте это:

$Text = "acc\E34rate
acc\?4rate
acc§54rate"; # This is the joined string (using enter key) after reading from the file
$Text =~ s/^acc.*?rate$/accutext/mg;
print $Text;

Я только что проверил его в своей системе, и он работает нормально.

Выход:

accutext
accutext
accutext

m означает, что строка является многострочной строкой и что каждый \n будет рассматриваться как символ конца строки.

g должен заменить все возможные вхождения.

Чтобы вернуться в виде массива, разделите, используя \n.

Обратите внимание, что приведенный выше код написан исходя из предположения, что каждая строка в файле будет начинаться и заканчиваться соответственно acc и text, и что после или до них в этой строке нет дополнительного текста (т. Е. File не является с отдельными строками типа "Driving acc\?4rate at 60kmph" and only "acc\?4rate").
Если это слово находится между словами в предложении, замените приведенный ниже код в приведенном выше коде.

$Text =~ s/acc.*?rate/accutext/g;

Кстати, это будет работать и на всех возможных входах, включая код сверху.

...