Regex 当行的第一个字与给定格式匹配时提取行(PERL)
我有一个文件,如示例文件TEST.txt所示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
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