2014-02-20 65 views
2

我有一個文本文件,它看起來像這樣:如何用同一行中的文本替換單詞?

_map[0x00000044] = "screen"; 
_map[0x00000059] = "map"; 
_map[0x0000006e] = "info"; 

我想在每行的末尾來代替的話讓我看起來就像這樣:

_map[0x00000044] = "0044"; 
_map[0x00000059] = "0059"; 
_map[0x0000006e] = "006e"; 

我想在原地更新文件。我嘗試了以下,但必須有一個更簡單的方法。

my $infile = 'newnumbers.txt'; 
open my $input, '<', $infile or die "Can't open to $infile: $!"; 
my @finaldata =(); 

while (<$input>){ 
    chomp; 

    print "$1\n" if ($_ =~ /(0x0000.*])/); 
    push(@finaldata, $1); 
} 
+0

你的問題不清楚我。說前3行是你想要編輯的,你想如何改變這些行? – Miller

+0

是的,我想我的最終輸出爲_map [0x00000059] =「0059」;而不是_map [0x00000059] =「地圖」; – Mihir

+0

你想編輯文件本身嗎?或者你只是想輸出結果到屏幕上? – Miller

回答

3
use strict; 
use warnings; 

my $infile = 'newnumbers.txt'; 

local @ARGV = ($infile); 
local $^I = '.bac'; 
while(<>){ 
    s/(_map\[0x[[:xdigit:]]{4}([[:xdigit:]]{4})\] =)".*"/$1"$2"/; 
    print; 
} 

,或者如果你用perl的更新版本,正則表達式可能是由以下

s/_map\[0x[[:xdigit:]]{4}([[:xdigit:]]{4})\] = \K".*"/"$1"/; 
+0

出現錯誤「無法識別的轉義\ K通過C:\ Users \ MPatel \ Desktop \ replacenumbers.pl行13」。 – Mihir

+0

您正在運行較舊版本的perl,因此將不得不改變這一點。 – Miller

+0

偉大的幫助,但遺憾的是,這只是爲了「地圖」,如果我想要爲所有其他線路做這樣的事情..比如「地圖」,而不是「信息」,「屏幕」等。 – Mihir

0

如何:

my $infile = $ARGV[0] || 'newnumbers.txt'; 
open FH, $infile; 
my @lines = <FH>; 
s/(_.*(\w{4})] = ")\w+(";)/$1$2$3/ foreach @lines; 
print join '', @lines; 
相關問題