从Perl中具有文件名的字符串中删除子字符串

时间:2014-03-21 23:12:07

标签: perl

这是makefile输出,我需要从中删除*.d*.o个文件。我该怎么做?

gcc -c -m64 -march=x86-64  -Wall -Wno-strict-aliasing -DLINUX -D_GNU_SOURCE -DNDEBUG  -I. -I../include -I -MD -MF out/target/mytree/mycode/build/linux.x86_64/expr.d -o out/target/mytree/mycode/build/linux.x86_64/obj/expr.o expr.cpp

我不想用whitespaces拆分行,进行搜索,然后使用join将字符串放回去。

我能以其他方式做到吗?

1 个答案:

答案 0 :(得分:3)

可能是这样的:

use strict;
use warnings;

open(my $src_file, "<", "test.txt") or die $!;
open(my $dst_file, ">", "dest.txt") or die $!;
while (<$src_file>) { 
    my $line = $_; 
    $line =~ s/\s+\S+\.[do]\s/ /g;
    print $dst_file $line;
}
close($src_file);
close($dst_file);

它将改变:

gcc -c -m64 -march=x86-64  -Wall -Wno-strict-aliasing -DLINUX -D_GNU_SOURCE -DNDEBUG  -I. -I../include -I -MD -MF out/target/mytree/mycode/build/linux.x86_64/expr.d -o out/target/mytree/mycode/build/linux.x86_64/obj/expr.o expr.cpp
to
gcc -c -m64 -march=x86-64  -Wall -Wno-strict-aliasing -DLINUX -D_GNU_SOURCE -DNDEBUG  -I. -I../include -I -MD -MF  -o  expr.cpp

或者您可以使用此正则表达式:

$line =~ s/-(?:MF|o)\s+\S+\.[do]\s/ /g;

还要移除尾随的-MF-o,以转换为:

gcc -c -m64 -march=x86-64  -Wall -Wno-strict-aliasing -DLINUX -D_GNU_SOURCE -DNDEBUG  -I. -I../include -I -MD   expr.cpp