Perl 拆下特定行中的卡舌

Perl 拆下特定行中的卡舌,perl,perl-module,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 0x000

这个问题我已经试过了,但在这方面我一无所获。 我的输入文件是一个包含所有汇编指令的汇编文件

我有这个输入文件:

.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";
        }

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

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";
        }

    }
my$filename='c:\Desktop\P4x.lst';
我的$line=0;
打开(文件,$filename)或死亡“无法读取文件名”;
我的@lines=;
斩线;
foreach my$行(@行)
{
如果($line=~/0x*/)
{
$line=~s/[]*\\\\\\\\\\\\\\\\\\\\\\\\\[]*\\\\\\\\\[]*/\124;/g;
打印“$line\n”;
}
}
因此,如果我在这里遇到带有0x*的行,那么我想删除额外的空间。 谁能帮帮我吗。 多谢各位

if ($line =~ s/^\h+(?=0x)//) {
  $line =~ s/\h+/ /g;
  print $line;
}
或者从命令行

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

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

我不确定为什么在正则表达式中有管道字符
|
,因为示例数据中没有管道字符

表面上看,您只需要
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;
}
这两种解决方案都将修改后的文本发送到标准输出,并且可以使用重定向将其写入文件


更新

如果您想将所有空格更改为单个空格,并删除前导空格,正如
@ССаа27
所理解的,那么您只需要更改

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


感谢您的快速解决方案。但是我们可以使用perl脚本来完成吗:):)谢谢您的快速解决方案。