Perl:将文件数据输入到另一个文件的当前位置

时间:2013-08-03 18:02:40

标签: perl perl-module

我有两个文件,例如

文件1

abcd

file2的

this is test
it is abcd but

我想在

之间添加abcd

输出

this is test
abcd
it is abcd but

我能够使用正则表达式将file1与file2进行比较,并获取postin,其中file1内容等于file2行

就像这里..“abcd”包含在“它是abcd但是”

但是如何在它上面添加abcd呢?这只是一个例子。我的执行文件非常大。如果您可以帮我开发通用脚本以与其他文件一起使用,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是我想到的(未经测试):

perl -nlwe 'if (defined($ab)) { s/^(?=.*$ab)/$ab\n/; print; }
            else { $ab = quotemeta($_); }' file1 file2

说明:

开关:

  • -p读取文件和打印行
  • -l处理换行符

首先,我们从file1获取行,该行存储在$ab中。因为我们使用定义或赋值,所以我们只得到第一个值,它来自file1。我们使用quotemeta()来禁用元字符。然后我们只用正则表达式检查每一行,如果出现这个单词,我们首先在该行上添加它,然后是换行符。正则表达式使用行锚^的开头来设置行开头的插入点。然后我们使用前瞻断言来确保该行包含单词。

这是脚本版本:

use strict;
use warnings;

$\ = "\n";                 # output field separator 
my $ab;
while (<>) {               # read argument files
    chomp;                 # remove newline
    $ab //= quotemeta($_); # set $ab
    s/^(?=.*$ab)/$ab\n/;   # perform substitution
}
continue {
    print;
}

答案 1 :(得分:-1)

这是我的解决方案。

每行保存到$ prev。当下一行匹配/ $ match /并且前一行$ prev时,则打印$ match,然后将当前行分配给最后一行变量。

一衬垫:

perl -nle 'if (defined($m)) {/$m/ and $prev and print $m;$prev=$_;print} 
           else { $m = quotemeta($_) }' file1 file2

脚本:

#!/usr/bin/env perl

use v5.14;

open FH_ONE, '<', 'file1'
    or die "Can not open: $!";

open FH_TWO, '<', 'file2'
    or die "Can not open: $!";

while (<FH_ONE>) {
    chomp;
    my $match //= quotemeta($_);
    my $prev;

    while (<FH_TWO>) {
        chomp;
        say $match if /$match/ and $prev;
        $prev = $_;
        say;
    }
}