誰能告訴我,如何在一個文本檔案中搜索一個詞,并用一個值替換前2個出現的詞,用另一個值替換后2個出現的詞,以此類推,使用perl腳本?這有可能嗎?下面的命令只是將所有cat1、cat2、cat3等替換為dog1,但我想將cat1、cat2替換為dog1,cat3、cat4替換為dog3。
s/cat[0-9]/dog1/g。
下面是我試過的腳本:
#!/usr/bin/perl -w
使用嚴格。
my $file = 'C:Temp est.txt';
rename($file, $file . '.bak') 。
open(IN, '< ' . $file . '.bak') or die $!
open(OUT, '>' . $file) or die $!
while(<IN>)
{
$_ =~ s/cat[0-9]/dog1/g;
print OUT $_;
}
close(IN);
close(OUT)。
輸入:
Replacement value1: dog51
替換值2:Dog23
替換值3:Dog77
替換值4:Dog95
現有檔案:
<some texts>
test cat01文本
test cat32 text
test cat83 text
測驗cat54文本
test cat92 text
Test cat13 text
Test cat62 text
測驗 cat23 文本
替換后的檔案:
<some texts>
test dog51 text
test dog51 text
測驗Dog23文本
測驗Dog23文本
測驗Dog77文本
測驗Dog77文本
測驗Dog95文本
測驗Dog95文本
uj5u.com熱心網友回復:
參考s//(尤其是e修飾符)。 這就把偶數替換成了N-1.
use警告。
use strict;
while (<DATA>) {
s/cat(d )/sprintf 'dog
', (1 % 2) ? 1美元 : (1-1)/e;
print。
}
__DATA__
cat1
cat2
cat3
cat4
cat5
cat6
印刷品:
dog1
狗1
dog3
狗3
dog5
狗5
(d )捕獲cat之后的數字,并將其存盤在$1變數中,該變數用于替換的右側。
經過對Question的更新,看起來替換值應該是隨機的:
use warnings;
use strict;
my $cnt = 0;
my $n;
while (<DATA>) {
if (/catd/) {
$cnt = ($cnt) ? 0 : 1;
$n = randint() if $cnt;
s/cat(d )/dog$n/。
}
print;
}
sub randint{
return sprintf 'd', intrand 100;
}
__DATA__
test cat01 text
test cat32 text
測驗cat83文本
test cat54 text
測驗 cat92 文本
Test cat13 text
Test cat62 text
測驗 cat23 文本
印刷品:
test dog38 text
測驗狗38的文本
測驗Dog46文本
測驗Dog46文本
測驗Dog98文本
測驗Dog98文本
測驗狗59文本
測驗Dog59文本
每次運行代碼時,將顯示一組不同的數字。
uj5u.com熱心網友回復:
根據OP,輸入和輸出的編號沒有關聯性。
在這種情況下,可能的解決方案是哈希映射輸入值到輸出值。
use strict;
use warnings;
my %hash = (
'cat1' => 'dog1',
'cat2' => 'dog1',
'cat3' => 'dog3',
'cat4' => 'dog3', 'cat4' =>.
);
while( my $line =<DATA> ) {
$line =~ s/($_)/$hash{$1}/g for keys %hash。
print $line;
}
某個句子cat1在這里。
一些cat1的句子放在這里
一些cat3的句子在這里
某個句子的cat1在這里
cat34的一些句子在這里
cat4有些句子在這里
輸出
some sentence dog1 goes here
一些狗3的句子在這里
一些句子dog1在這里
一些句子cat34在這里
狗3的一些句子在這里
預定義雙重替換的示例代碼(用于改變問題中的問題描述)
use strict;
use warnings;
my($index,$counter) = (-1, -1);
my @input = (
'Replacement value1: dog51',
'Replacement value2: dog23',
'Replacement value3: dog77',
'置換值4: dog95'.
);
@input = map { s/Replacement valued: // && $_ } @input;
while( my $line = <DATA> ) {
if( $line =~ /catd{2}/ ) {
$index unless $counter%2;
$line =~ s/catd{2}/$input[$index]/;
}
print $line。
}
__DATA__
<一些文本>
測驗cat01文本
test cat32 text
test cat83 text
test cat54 text
測驗cat92文本
Test cat13 text
Test cat62 text
測驗cat23文本
<一些文本>。
輸出
<some texts>
test dog51 text
test dog51 text
測驗Dog23文本
測驗Dog23文本
測驗Dog77文本
測驗Dog77文本
測驗Dog95文本
測驗Dog95文本
<一些文本>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311308.html
標籤:
