阅读perl中的特定文本模式

时间:2016-01-11 12:06:10

标签: perl

我想从文本文件中只读取特定文本,例如: FileExample:

1111111/first/second/third/fourth.c11111111...etc...
1111111/afirst/asecond/athird/afourth.c11111111...etc...etc

我想读取整个文件,除了从第一个“/”的第3个“1”到第4个“/”之后的“.c”的文件部分,以使自己更清楚我会加粗text我希望我的程序能够读取并保留unbolded我不希望程序读取的部分文本。

  

1111 111 /第一/第二/第三/ fourth.c的 11111111 ...等等...等   的 1111 111 / afirst / asecond / athird / afourth.c的 11111111 ...等等...等

在我使用粗体文本执行所有操作之后,我想在另一个文件中将未编辑的未加粗文本和带有修改的粗体文本写在操作之后,并将其放在原始文件顺序中。

open my $fh1, '<', 'hex.txt';
open my $fh2, '<', 'hex2.txt';

until ( eof $fh1 or eof $fh2 ) {


    my @l1 = map hex,unpack '(a2)*', <$fh1>;
    my @l2 = map hex,unpack '(a2)*', <$fh2>;

    my $n = @l2 > @l1 ? @l2 : @l1;

    my @sum = map {

        $l1[$_] + $l2[$_];
    } 0 .. $n-1;

    @sum = map { sprintf '%X', $_ } @sum;

    open my $out, '>', 'sum.txt';
    print { $out } @sum, "\n";
}

我想将文件十六进制中的十六进制值与文件hex2中的总和值相加,两个文件具有相同的构造类型,两者在同一位置都有文本和十六进制值,并且具有完全相同的长度。我只需要了解如何告诉他从location1读到location2。

  

将文件转换为十六进制:

{
    my $input = do {
        open my $in, '<', $ARGV[0];
        local $/;
        <$in>
    };

    open my $out, '>', 'hex.txt';

    print $out unpack 'H*', $input;

}

2 个答案:

答案 0 :(得分:2)

您的准确标准尚不清楚。这些数字总是一个吗?当你希望得到帮助时,展示这么简单的例子是错误的。但我建议您使用split

或许这样的事情?

use strict;
use warnings;
use feature 'say';

my $data = do {
    local $/;
    <DATA>;
};

$data =~ tr/\n//d;

say for split qr{\d\d\d(?:/\w+)+/\w+\.c}, $data;

__DATA__
1111111/first/second/third/fourth.c11111111...etc...
1111111/afirst/asecond/athird/afourth.c11111111...etc...etc

输出

1111
11111111...etc...1111
11111111...etc...etc

答案 1 :(得分:0)

我更改了输入,以便能够识别匹配的1:

abcd111/first/second/third/fourth.cX1111111...etc...
abcd111/afirst/asecond/athird/afourth.cX1111111...etc...etc

这似乎产生了你想要的输出

perl -pe 's=([^/]+).../.*\.c=$1='
  • [^/]是一个字符类,它匹配任何不是斜杠的东西;
  • +表示必须出现一次或多次
  • 将它放入括号中使其成为“捕获组”,即Perl将记住与该部分匹配的内容。
  • .../匹配任意三个字符后跟斜杠。
  • .*匹配任何内容。
  • \.c匹配一个点后跟一个c
  • 示例输入中的整个匹配部分(abcd,直到c之前的X)被s替换(因此起始$1) },即第一个捕获组的内容,即样本输入中的abcd