我有两个文件,例如
文件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呢?这只是一个例子。我的执行文件非常大。如果您可以帮我开发通用脚本以与其他文件一起使用,我将不胜感激。
答案 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;
}
}