使用 RegEx 解析文件以查找带有捕获组的多行匹配项

使用 RegEx 解析文件以查找带有捕获组的多行匹配项

我有一些文件。我想从每个文件中匹配以下两行字符串。

<TagA>A7C</TagA>
    <!--<TagA>70458548767</TagA>-->

但是,我希望 grep 或 pcregrep 或任何 Linux 实用程序显示:

A7C 767

注意:第二行数字的前 8 位可以视为随机数。就我的目的而言,无论其值是多少,都可以将其删除。此外,第二行有前导空格。

GC_

答案1

分离出您想要的数字:

$ grep -oP '\w{3}(?=</TagA>)' input
A7C
767

在上面的 中,\w{3}匹配任何三个单词字符,并且(?=</TagA>)要求该匹配位于 之前</TagA>。通常,grep 会打印包含匹配项的整行。 -o告诉 grep 只打印匹配项。 -P告诉 grep 使用 Perl 语法,这是启用前瞻功能所必需的(?=</TagA>)

要将两个数字放在一行上:

$ grep -oP '\w{3}(?=</TagA>)' input | sed 'N;s/\n/ /'
A7C 767

答案2

这是一个适用于任意次数的 Perl 方法:

perl -ane 'print "$& " if m~\w{3}(?=</TagA>)~' file

解释:

print "$& "             # print the match with a space after
if m~\w{3}(?=</TagA>)~  # match 3 word characters before end tag </TagA>

示例文件:

blah
<TagA>A7C</TagA>
    <!--<TagA>70458548767</TagA>-->
blah blah
<TagB>A7C</TagB>
    <!--<TagA>70458548767</TagA>-->
blah blah
<TagA>A7C</TagA>
    <!--<TagC>70458548767</TagC>-->
blah blah

输出:

A7C 767 767 A7C 

相关内容