当行的第一个单词与给定格式(PERL)匹配时提取行

时间:2012-08-23 09:34:24

标签: regex perl extract

我有一个文件,如示例文件TEST.txt

所示
TEST.txt
top.s.1 { i go to home >85

jungle.lion and city }

dog7.1.e {dalmition <101

white and black }

cars_1.3.bmw_r { very good car =10

merc is merc.r.5_two } 

我想提取以两个“的字/字段开头的行。”。示例输出如OUT.txt

所示
OUT.txt
 top.s.1 { i go to home >85
 dog7.1.e {dalmition <101
 cars_1.3.bmw_r { very good car =10

我尝试使用此正则表达式提取它

perl -ne '/^\w+.*?\.\w\.\d+.*?/ig && print' TEST.txt > OUT.txt

错过了几个表达式。谁能帮助我获得所需的?

注意:这只是一个示例输入文件,因此这个oneliner可能适用于此,但它不够准确,无法找到原始文件中的所有字符串。

4 个答案:

答案 0 :(得分:2)

你的正则表达式/^\w+.*?\.\w\.\d+.*?/ig需要一串字母数字后跟任何长度,然后是一个点,一个字母数字,另一个点,然后是一些数字,然后是任何东西。 /i修饰符是不必要的,因为模式中没有字母字符,/g是不必要的,因为/^/表示它只能匹配一次。

删除.*?并将\w\d+更改为\w+,它应该有效。

这将满足您的需求。它期望输入文件作为命令行参数

use strict;
use warnings;

while (<>) {
  print if /^\w+\.\w+\.\w+[^\w.]/;
}

或作为命令行程序:

perl -ne 'print if /^\w+\.\w+\.\w+[^\w.]/' TEST.txt

答案 1 :(得分:0)

使用awk

awk '{if ($1 ~ /.*\..*\..*/) {print}}' TEST.txt

测试检查第一个字段上的所需模式

答案 2 :(得分:0)

如果您的主要目标是检查块的“标题”,我认为首先将标题和块解析为哈希是个好主意。完成后,您可以根据需要检查期间.的哈希键:

> perl -MData::Dumper -nlwe 'if (/^\s*([\w.]+)\s*({\s*.*)/) { 
    $key = $1; $a{$key} = $2;
    } else { 
    $a{$key} .= $_ } }{ print Dumper \%a;' data.txt

<强>输出:

$VAR1 = {
      'cars_1.3.bmw_r' => '{ very good car =10merc is merc.r.5_two } ',
      'top.s.1' => '{ i go to home >85jungle.lion and city }',
      'dog7.1.e' => '{ dalmition <101white and black }'
};

密钥的后处理类似于:

@keys = grep /\..*\./, keys %a;   # 2 or more periods
@keys = grep /^[^.]*\.[^.]+\.[^.]*$/, keys %a;  # exactly 2 periods

我选择使用-l选项删除块中的换行符,但如果您觉得它们应该保留,只需从命令行开关中删除-l

答案 3 :(得分:-1)

我会使用以下正则表达式:

perl -ne 'print if /^[^ .]*\.[^ .]*\./'

即。在行的开头可以有任何不是空格或点的东西,甚至什么都没有,那么就有一个点,而不是一个空格或一个点,然后再一个点。