【问题标题】:parse a text file suing regex in perl在 perl 中使用正则表达式解析文本文件
【发布时间】:2015-10-20 08:11:03
【问题描述】:

您好,我有一个需要解析的文本文件

libA/cellA/view1/data.dm#1 - edit default 
libA/cellA/view1/master.tag#1 - edit defau
libA/cellA/view1/sch.oa#1 - edit default c
libA/cellA/view1/thumbnail_128x128.png#1 -
libA/cellB/view1/data.dm#1 - edit default 
libA/cellB/view1/master.tag#1 - edit defau
libA/cellB/view1/sch.oa#1 - edit default c
libA/cellB/view1/thumbnail_128x128.png#1 -
libA/cellB/symbol/master.tag#1 - edit defa
libA/cellB/symbol/symbol.oa#1 - edit defau
libA/cellB/symbol/thumbnail_128x128.png#1 
libA/cellC/view1/data.dm#1 - edit default 
libA/cellC/view1/master.tag#1 - edit defau
libA/cellC/view1/sch.oa#1 - edit default c
libA/cellC/view1/thumbnail_128x128.png#1 -
libA/cellD/veriloga/data.dm#1 - edit defau
libA/cellD/veriloga/master.tag#1 - edit de
libA/cellD/veriloga/netlist.oa#1 - edit de
libA/cellD/veriloga/veriloga.va#1 - edit d
libA/cellE/view1/data.dm#1 - edit default 
libA/cellE/view1/master.tag#1 - edit defau

Step1:在上面的文本文件中,我只想保留文本,直到第三次出现“/”字符。例如输出应该如下:

libA/cellA/view1
libA/cellA/view1
libA/cellA/view1
libA/cellA/view1
libA/cellB/view1
libA/cellB/view1
libA/cellB/view1
libA/cellB/view1
libA/cellB/view2
libA/cellB/view2
libA/cellB/view2
libA/cellC/view1
libA/cellC/view1
libA/cellC/view1
libA/cellC/view1
libA/cellD/view3
libA/cellD/view3
libA/cellD/view3
libA/cellD/view3
libA/cellE/view1
libA/cellE/view1

Setp2:那我想删除重复的行,中间保留空行:

libA/cellA/view1



libA/cellB/view1



libA/cellB/view2


libA/cellC/view1


libA/cellD/view3




libA/cellE/view1

关于如何在 Perl 中执行此操作的任何指针? 我正在尝试这样的事情:

#!/usr/bin/perl
# File: parse.pl

unless (open(MYFILE, "sample.txt")) 
{
    die ("cannot open input file file1\n");
}

unless (open(OUTFILE, ">outfile.txt")) 
{
    die ("cannot open output file outfile\n");
}


# if the program gets this far, the file was
# opened successfully
$line = <MYFILE>;
while ($line ne "") 
{
  #print ($line);

 my ($lib, $cell, $view) = split /:/, $line;
 #print "$lib\n";
 #print "$cell\n";
 #print "$view\n";
 print OUTFILE ($lib/$cell/$view/n);
  $line = <MYFILE>;

}

【问题讨论】:

  • 你想要split 和一个哈希,而不是一个正则表达式。到目前为止,您尝试过什么?
  • 我不能使用正则表达式并且在出现第三个“/”字符后什么都不替换吗?
  • 你可以,但你不应该。这不仅仅是/——它也是你想要保留的斜线之间的所有东西。另外,您的示例输出是否正确? libA/cellC/view1 似乎仍有重复的行。
  • 既然你用你迄今为止尝试过的内容更新了你的帖子(我猜......但是一个格式错误的正则表达式匹配并不会真正做任何事情),我会指出你可能还需要一些代码来逐行处理您的输入文件并根据您的发现做出一些决定。
  • 对不起,我更新了帖子以更正示例输出。感谢您的帮助

标签: regex perl


【解决方案1】:

另存为script.pl(或其他)并像这样调用:perl script.pl input.txt

use strict;
use warnings;

my %unique;

while (<>) {
    my @parts = split(/\//, $_);
    my $key = join('/', @parts[0 .. 2]);

    if (!$unique{$key}++) {
        print $key;
    }

    print "\n";
}

【讨论】:

  • 可能会弹出部分,因此它可以应对不同的路径长度。
【解决方案2】:

是这样的

代码:

my %unique = ();
my @fields = undef;
while(<DATA>){
    chomp;
    @fields = split /\//, $_;
    if (not $unique{"$fields[0]/$fields[1]/$fields[2]"}++){
        print "$fields[0]/$fields[1]/$fields[2]"
    }else{
        print "\n";
    }
}
#map {print $_."\n"} keys %unique;

__DATA__
libA/cellA/view1/data.dm#1 - edit default
libA/cellA/view1/master.tag#1 - edit defau
libA/cellA/view1/sch.oa#1 - edit default c
libA/cellA/view1/thumbnail_128x128.png#1 -
libA/cellB/view1/data.dm#1 - edit default
libA/cellB/view1/master.tag#1 - edit defau
libA/cellB/view1/sch.oa#1 - edit default c
libA/cellB/view1/thumbnail_128x128.png#1 -
libA/cellB/symbol/master.tag#1 - edit defa
libA/cellB/symbol/symbol.oa#1 - edit defau
libA/cellB/symbol/thumbnail_128x128.png#1
libA/cellC/view1/data.dm#1 - edit default
libA/cellC/view1/master.tag#1 - edit defau
libA/cellC/view1/sch.oa#1 - edit default c
libA/cellC/view1/thumbnail_128x128.png#1 -
libA/cellD/veriloga/data.dm#1 - edit defau
libA/cellD/veriloga/master.tag#1 - edit de
libA/cellD/veriloga/netlist.oa#1 - edit de
libA/cellD/veriloga/veriloga.va#1 - edit d
libA/cellE/view1/data.dm#1 - edit default
libA/cellE/view1/master.tag#1 - edit defau

输出:

libA/cellA/view1


libA/cellB/view1


libA/cellB/symbol

libA/cellC/view1


libA/cellD/veriloga


libA/cellE/view1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多