2015-01-21 110 views
2

我试过的这个特定问题并不能在任何地方得到。 我的输入文件是一个具有所有汇编指令的汇编文件。删除特定行中的选项卡

我有这个输入文件:

.src_ref 0 "call.s" 24 first 
     0x000000 0x5a80 0x0060   BRA.l 0x60 
.src_ref 0 "call.s" 30 first 
     0x000002 0x1bc5    RETI 
.src_ref 0 "call.s" 31 first 
     0x000003 0x6840    MOV R0L,R0L 
.src_ref 0 "call.s" 35 first 
     0x000004 0x1bc5  

所有我想要做的就是删除的选项卡或空格,当我遇到0X线*****

到目前为止,我管理这个代码,但我无法删除它。 尝试了几个选项,并无法让它工作。

预计输出

0x000000 0x5a80 0x0060 BRA.l 0x60 
0x000002 0x1bc5 RETI 
0x000003 0x6840 MOV R0L,R0L 

到目前为止,我写了一个代码为

my $filename = 'c:\Desktop\P4x.lst'; 
my $line = 0; 
open(FILE,$filename) or die "Could not read from filename"; 
my @lines = <FILE>; 
chop @lines;  


foreach my $line(@lines) 
    { 
     if ($line =~/ 0x*/) 
     { 
      $line =~ s/[ ]*\|[ ]*\|[ ]*\|[ ]*\|[ ]*/|/g; 
      print "$line\n"; 
     } 

    } 

所以在这里,如果我遇到0X行*然后我想删除多余的空间。 任何人都可以帮助我。 谢谢。

回答

2
if ($line =~ s/^\h+(?=0x)//) { 
    $line =~ s/\h+/ /g; 
    print $line; 
} 

或命令行,

perl -ne 'print if s/^\h+(?=0x)// and s/\h+/ /g' file 
+0

谢谢你快速解决方案。但我们可以使用perl脚本来完成:) :) – vk41286 2015-01-21 11:19:18

0

如何:

if ($line =~ m/\A\s+0x/) { 
    $line =~ s/\s+/ /g; 
} 
+0

感谢您的快速解决方案。 – vk41286 2015-01-21 12:45:02

0

我不知道为什么你在你的正则表达式的管道符|,因为有没有在您的样本数据。

在它的面前,所有你需要的是s/^\s+(?=0x)//

在程序中,这应该是这样的

use strict; 
use warnings; 

my $filename = 'C:\Desktop\P4x.lst'; 
open my $fh, '<', $filename or die qq{Failed to open "$filename" for input: $!}; 

while (<$fh>) { 
    s/^\s+(?=0x)//; 
    print; 
} 

或者在命令行上一个班轮

perl -pe's/^\s+(?=0x)//' 

两种解决方案都将修改后的文本发送到STDOUT,并且可以使用重定向将其写入文件。


更新

如果你想改变所有空格为一个空格以及消除前导空格,如@Сухой27已经明白,那么你只需要改变

s/^\s+(?=0x)// 

s/^\s+(?=0x)// and s/\s+/ /g