2012-09-06 48 views
1

替換字符串的文件我輸入文件的內容如下:如何搜索和在Perl

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

我需要更換任何字符串abc \ --------------\abc之間在我輸入文件,ABC\CBA

我曾嘗試類似下面得到了需要replaced.But我碰到困難的時候,我需要使用搜索和替換字符串:

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

s/$string2/$string3/g 

能任何人都可以幫忙嗎?提前致謝。

回答

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 
+0

感謝Mike.This幾乎是我想要的。結果印在unix上是我想要的。但是,我需要用獲得的結果覆蓋我的輸入文件.FYI,我的輸入文件在執行之前和之後仍然是相同的腳本。 – Steven

+0

根據需要使用的頻率,有幾十種方法可以做到這一點。最簡單的(在我看來)是將輸出寫入臨時文件,刪除原始文件,然後將temp重命名爲原始輸入文件名。 –

+0

基於@ TLP的編輯,我猜我的方法是老派:-P –

0

如果您不想在默認變量$_操作替代,你必須使用=~操作:

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

謝謝choroba。我試圖打開我的文件,並執行所有搜索和替換操作,但似乎lk對我的輸入文件沒有影響。我已經嘗試下面:foreach我的$文件($輸入){打開(我,$文件)或死亡! ; while(){my $ pattern = qr/abc \\。* \\ abc /; my $ string2 = join「\ n」,@input_file; my $ string3 ='ABC \ CBA'; $ string2 =〜s/$圖案/ $ STRING3 /克;打印$ string2; } close(I)} – Steven

+0

爲什麼你首先在換行符上分割,然後用換行符連接那個分割符?似乎多餘。 – TLP

+0

@TLP:如果你問我,我只想用'@ input_file'作爲問題的作者。 – choroba

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 

\K(保留)escap e序列表示這些字符不會被刪除。同樣,前瞻斷言(?= ...)將保持這部分比賽。我以爲你只是想改變之間的字符。

而不是\K可以使用後視聲明:(?<=abc\\)。作爲個人偏好,我改用\K

1

要解決有關直接替換文件「inplace」中的文本的註釋,您可以使用-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; 
} 
+0

使用'for'而不是'while',並且由於'Tie :: File'將更新文件,'print'不是必需的。 (我的一位同事從這段代碼片段中獲得了CopyPasteInheritance錯誤^^) – xlat