这个特殊的问题我已经尝试过,无法在任何地方获得。 我的输入文件是一个包含所有汇编指令的汇编文件。
我有这个输入文件:
.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 *的行,那么我想删除额外的空间。 任何人都可以帮助我。 谢谢。
答案 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