我有一个文件,如示例文件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可能适用于此,但它不够准确,无法找到原始文件中的所有字符串。
答案 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 /^[^ .]*\.[^ .]*\./'
即。在行的开头可以有任何不是空格或点的东西,甚至什么都没有,那么就有一个点,而不是一个空格或一个点,然后再一个点。