Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 当行的第一个字与给定格式匹配时提取行(PERL)_Regex_Perl_Extract - Fatal编程技术网

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

Regex 当行的第一个字与给定格式匹配时提取行(PERL),regex,perl,extract,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 } 它与几个表达方式不匹配。有人能帮我得到想要的吗 注意:这只是一个示例输入文件,因此这一行程序可能适用于此,但

我有一个文件,如示例文件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 } 
它与几个表达方式不匹配。有人能帮我得到想要的吗

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

使用
awk

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

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

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

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

i、 e.行的开头可以有任何不是空格或点的东西,或者甚至什么都没有,然后有一个点,除了空格或点之外,还有一个点。

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

移除
*?
并将
\w
\d+
更改为
\w+
,它应该可以工作

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

use strict;
use warnings;

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

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

> 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 }'
};

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

我对此不熟悉。。但是我可以在Perl中使用相同的类型吗?在这个问题上没有
awk
标记,您的模式匹配任何包含两个点的行,下面的匹配是-xyz..cfv..dfr{good}只有两个点还是字符串的其余部分无关紧要?您的主要目标是找到“标题”,即
{…}之前的字符串吗
block?如果是这样的话,在正则表达式中包含这些块可能是明智的。在成千上万的行中,我必须提取以前面提到的有两个点的字符串开始的行。开头字符串的格式是必须提取的某种名称@bruce我不想与你评论中的行匹配,因为它有两个连续的点。这对我来说很好。。我做了几分钟的改变,完全按照我想要的方式工作。。。非常感谢……)
perl -ne 'print if /^\w+\.\w+\.\w+[^\w.]/' TEST.txt
> 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