簡體   English   中英

如何在 Perl 中搜索和替換文件中的字符串

[英]How to search and replace string in a file in Perl

我的輸入文件的內容如下所示:

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

我需要用ABC\\CBA替換輸入文件中abc \\ --------------\\abc之間的任何字符串。

我嘗試過類似下面的方法來獲取需要替換的字符串。 但是當我需要使用搜索和替換時,我卡住了:

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

我怎樣才能解決這個問題?

perl -i -pe 's/this/that/g;'  file1

修復文件的單行:

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

\\K (保持)轉義序列意味着這些字符不會被刪除。 同樣,前瞻斷言(?= ... )將保留匹配的那部分。 我假設您只想更改兩者之間的字符。

可以使用后視斷言代替\\K(?<=abc\\\\) 作為個人偏好,我使用了\\K代替。

如果您不希望替換對默認變量$_進行操作,則必須使用=~運算符:

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

要解決您關於直接替換文件中“就地”文本的評論,您可以使用-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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM