首页 > 解决方案 > Perl 提取组,从不同的行向后看

问题描述

我已经尝试过网络搜索并在 stackexchange 上阅读了几个答案,但仍然无法理解为什么命令不提取任何内容。最后我想从不同的行中提取组,例如从

Code>TEST1<Code Code2>best<Code2
Code>test2<Code
Type>false<Type

通过在结果之间找到所需的密钥Type并首先在结果之上提取Code,因此在上面的情况下得到test2. 但我无法成功地从多行中提取一些东西,即

perl -lne 'print $1,"_",$2 if /Code>(.*)<Code[\s\S\n]*?Type>(.*)<Type/'<test.txt什么都不打印。
我玩过删除ln参数和添加/删除贪婪?并尝试.代替[\s\S\n].

perl -lne 'print $1,"_",$2 if /Code>(.*)<Code[\s\S\n]*?Code2>(.*)<Code2/'<test.txt 给出了TEST1_best相同的行提取工作。

我错过了什么?我想在一行命令中完成吗?

标签: regexperl

解决方案


以下命令回答了您的问题:它收集模式中包含的所有值Code>...<Code,如果它们后面跟着一个Type>...<Type模式(中间可能有其他模式,但中间没有其他出现Code>...<Code):

perl -lne 's/^.*?(?=Code>)//s; for (split /Code>/) { print qq($1:$2\n) if /(.*?)<Code.*?Type>(.*?)<Type/s }' -0777 <test.txt

如果例如test.txt包含以下行,

Code>test4<Code Type>false<Type
Code>test3<Code
Type>true<Type
Code>TEST1<Code Code2>best<Code2
Code>test2<Code
Type>false<Type

然后该命令将收集以下值对:

test4:false
test3:true
test2:false

编辑于 04/08/2019, 17:38 CEST 我编辑了命令以删除文件的“标题部分”(第一次出现之前的部分Code>),因为它可能 - 由于文件编辑器的一些错误 - 包含<Code没有打开的结束标签Code>而是一个错字,例如Cde>. 我的假设是完整的文件是“语法正确的”,因为它由 type 的元素组成/(\w+)>.*?<\1/,由空格(包括换行符)分隔。对于不符合此语法的文件,该语句不防水。


推荐阅读