3

入力ファイルの内容を以下に示します。

abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3

abc \ --------------\abc入力ファイル内の間にある文字列を。に置き換える必要がありますABC\CBA

置き換える必要のある文字列を取得するために、以下のようなものを試しました。しかし、検索と置換を使用する必要があるときに行き詰まります。

my $string1 = qr/abc\W+([^a]+)/;
my $string2 = map{/$string1/ => " "} @input_file; # The string that needs to be replaced
my $string3 = 'ABC\CBA'  # String in that. I want it to replace to

s/$string2/$string3/g

どうすればこれを修正できますか?

4

5 に答える 5

10
perl -i -pe 's/this/that/g;'  file1
于 2012-09-06T22:31:45.913 に答える
2

ファイルを修正するワンライナー:

perl -plwe 's/abc\\\K.*(?=\\abc)/ABC\\CBA/' input.txt > output.txt

またはスクリプトとして:

use strict;
use warnings;

while (<DATA>) {
    s/abc\\\K.*(?=\\abc)/ABC\\CBA/;
    print;
}

__DATA__
abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3

( \Kkeep) エスケープ シーケンスは、これらの文字が削除されないことを意味します。同様に、先読みアサーション(?= ... )は一致のその部分を保持します。その間の文字を変更したいだけだと思いました。

代わりに、\K後読みアサーションを使用できます(?<=abc\\)。個人的な好みとして、\K代わりに使用しました。

于 2012-09-06T17:02:41.093 に答える
1

ファイル内のテキストを「インプレース」で直接置き換えることについてのコメントに対処するには-i、ワンライナーのスイッチを使用できます。Tie::Fileスクリプトでは、配列内の (変更可能な) 要素としてファイルの行への読み取り/書き込みアクセスを許可する の使用を検討できます。Mike/TLP の回答をコピーするには:

#!/usr/bin/perl
use strict;
use warnings;

use Tie::File;

tie my @file, "Tie::File", "tryit.txt" or die $!;

# I think you have to use $_ here (done implicitly)
while (@file) {
    s/(abc\\)(.*?)(\\abc)/$1ABC\\CBA$3/;
    print;
}
于 2012-09-07T01:32:30.953 に答える
1
#!/usr/bin/perl
use strict;
use warnings;

open my $fh,"<", "tryit.txt" or die $!;

while (my $line = <$fh>) {
    $line =~ s/(abc\\)(.*?)(\\abc)/$1ABC\\CBA$3/;
    print $line;
}

入力データで次を与えます。

abc\ABC\CBA\abc\!!!!!
abc\ABC\CBA\abc\df3gwddw
abc\ABC\CBA\abc\f3
于 2012-09-06T17:17:13.443 に答える
1

デフォルト変数で置換を実行したくない場合は、次の演算子$_を使用する必要があります。=~

#!/usr/bin/perl
use warnings;
use strict;

my @input_file = split /\n/, <<'__EOF__';
abc\**def\ghi**\abc\!!!!!
abc\**4nfiug\frgrefd\gtefe\wf4fs**\abc\df3gwddw
abc\**eg4/refw**\abc\f3
__EOF__

my $pattern = qr/abc\\.*\\abc/;       # pattern to be matched
my $string2 = join "\n", @input_file; # the string that need to be replaced
my $string3 = 'ABC\CBA';              # string i that i want it to replace to

$string2 =~ s/$pattern/$string3/g;
print $string2;
于 2012-09-06T16:28:25.510 に答える