regex - 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
相同的行提取工作。
我错过了什么?我想在一行命令中完成吗?
解决方案
以下命令回答了您的问题:它收集模式中包含的所有值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/
,由空格(包括换行符)分隔。对于不符合此语法的文件,该语句不防水。
推荐阅读
- json - 使用通配符键从 JSON 快速解码
- r - 如何在R中分解数据帧
- java - 列表已损坏且未添加
- flutter - 如何为 AlertDialog 颤振禁用 onBackPressed()
- swiftui - 如何通过swiftui中的事件更改图像的样式?
- android-layout - PDF 查看器与 Web 查看器 Android
- reactjs - useContext 值未定义
- python - 基于令牌的授权导致未经授权的 401
- apache-flink - Flink 流加入可能返回大结果集的维度表
- spring - MultiValueMap casuing issue application/json;charset=UTF-8 not supported