删除特定行中的选项卡

时间:2015-01-21 11:11:19

标签: perl perl-module

这个特殊的问题我已经尝试过,无法在任何地方获得。 我的输入文件是一个包含所有汇编指令的汇编文件。

我有这个输入文件:

.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 *的行,那么我想删除额外的空间。 任何人都可以帮助我。 谢谢。

3 个答案:

答案 0 :(得分:2)

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

或从命令行

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

答案 1 :(得分:0)

怎么样:

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

答案 2 :(得分: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