2015-01-21 2 views
2

Этот конкретный вопрос, который я пробовал и не смог нигде в SO. Мой входной файл представляет собой файл сборки, который имеет всю инструкцию по сборке.удалите вкладки в определенной строке

У меня есть этот входной файл:

.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

0

Как насчет:

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

Спасибо за быстрое решение. – vk41286

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, и его можно записать в файл с использованием перенаправления.


Update

Если вы хотите изменить все пробелы в одном пространстве, а также удаление ведущие пробелы, так как @Сухой27 понял, то вам просто нужно изменить

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

до

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