Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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从不同行提取具有lookback的组_Regex_Perl - Fatal编程技术网

Regex Perl从不同行提取具有lookback的组

Regex Perl从不同行提取具有lookback的组,regex,perl,Regex,Perl,我尝试过web搜索,并在stackexchange上阅读了一些答案,但仍然无法理解为什么命令不能提取任何内容。最后,我想从不同的行中提取具有lookback的组,例如从 Code>TEST1<Code Code2>best<Code2 Code>test2<Code Type>false<Type code>TEST1besttest2false(.*)(.*)以下命令回答了您的问题:它收集code>中包含的所有值……),因为它可能(由于文件编辑

我尝试过web搜索,并在stackexchange上阅读了一些答案,但仍然无法理解为什么命令不能提取任何内容。最后,我想从不同的行中提取具有lookback的组,例如从

Code>TEST1<Code Code2>best<Code2
Code>test2<Code
Type>false<Type
code>TEST1besttest2Type>false(.*)(.*)以下命令回答了您的问题:它收集
code>中包含的所有值……
),因为它可能(由于文件编辑器的某些错误)包含一个结束标记
,而不是像
Cde>
这样的键入。我的假设是,完整的文件在某种意义上是“语法正确的”,即它由
/(\w+)>*?类型的元素组成。另一种方法是使用渐进匹配和嵌入代码

perl -lne 'while (/\b(?:Code>(.*?)<Code(?{$c=$1})|Type>(.*?)<Type(?{print qq($c:$2\n) if defined $c;undef $c}))\b/g){}' -0777 <test.txt

perl-lne'while(/\b(?:code>(.*?)(.*?)如果您的数据在“d”中,则由gnu使用

sed -Ez 's/.*Code>(\w+)<Code\sType>\w*<Type.*/\1/' d

sed-Ez的/*code>(\w+)\w*(\w+)\w*
-n
会使代码对每一行都运行,因此
$\ucode>只包含一行。至少,您需要
-0777
才能使
-n
一次读取整个文件。@ikegami,我已尝试删除
-n
-0777
-其他参数是什么?如果您省略了
-n
,就剩下了一个参数一个根本不读任何东西的程序!就像我说的,它会导致
-n
(好吧,从技术上讲,任何
读线都是aka
aka
aka
)一次阅读整个文件,而不是一行一行。@ikegami,在读了更多关于perl的内容后,我现在想象你在写第二条评论时笑了,我也想笑自己。谢谢你。我试着用谷歌搜索
perl-0777选项
,但在顶级结果中似乎什么都不相关。我在哪里可以阅读有关perl的细节?例如,我似乎还想关于转义单引号的信息不同,我很难找到确定的信息。我询问的部分原因是我需要根据其他搜索调整您的代码,例如,使用
Cod>更改
打印文件第一行的开头,我更希望它找不到任何明显的信息。o,对于单引号,接受的答案没有p为您的代码生成错误,而更改为双引号会产生错误。实际上,尝试添加单引号会导致我发现查找某些内容而不是什么都找不到。@AlexeiMartianov读取行时更改文件分隔符的选项
-0
在标准
perlrun中描述了我期望的位置de>docu。它还描述了
-0777
广泛用于“slurp模式”(即,通过一个readline调用读取整个文件)。谢谢。这是日志文件-它们可能包含有问题的标记,可能根本不包含,可能在间断位置包含任何内容,看起来我最好提及有问题的内容。至于完整的perl文件建议,我需要在不同的位置运行代码,将行复制到命令提示符要容易得多。
msixpodualngcer
Is是一套完整的可用正则表达式修饰符,每个修饰符都是一个字母。您可以在任何正则表达式中添加任意多个修饰符。现在请阅读中的
s
的含义
test4:false
test3:true
test2:false
perl -lne 'while (/\b(?:Code>(.*?)<Code(?{$c=$1})|Type>(.*?)<Type(?{print qq($c:$2\n) if defined $c;undef $c}))\b/g){}' -0777 <test.txt
sed -Ez 's/.*Code>(\w+)<Code\sType>\w*<Type.*/\1/' d
perl -ne 'BEGIN{undef $/} /Code>(\w+)<Code\nType>\w*<Type/; print $1' d