删除特定行中的选项卡
问题描述:
我试过的这个特定问题并不能在任何地方得到。 我的输入文件是一个具有所有汇编指令的汇编文件。删除特定行中的选项卡
我有这个输入文件:
.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行*然后我想删除多余的空间。 任何人都可以帮助我。 谢谢。
答
if ($line =~ s/^\h+(?=0x)//) {
$line =~ s/\h+/ /g;
print $line;
}
或命令行,
perl -ne 'print if s/^\h+(?=0x)// and s/\h+/ /g' file
答
我不知道为什么你在你的正则表达式的管道符|
,因为有没有在您的样本数据。
在它的面前,所有你需要的是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
谢谢你快速解决方案。但我们可以使用perl脚本来完成:) :) – vk41286 2015-01-21 11:19:18