2015-01-21 109 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