我想出了一个解析GPG命令输出的正则表达式。
正则表达式:
^pubs+(S+)s+(S+)s+.*s+.{0,32}(.*)s+(.*)<(S+)>
要匹配的文本:
pub dsa1024 2018-02-28 [SCA]
0019003A003E5A22E2337044D955066111F63B00
uid [ unknown] John Doe <jogn@doe.name>
sub elg1024 2018-02-28 [E]
电流输出:
Group 1. 6-13 dsa1024
Group 2. 14-24 2018-02-28
Group 3. 69-77 11F63B00
Group 4. 78-112 uid [ unknown] John Doe
Group 5. 113-126 jogn@doe.name
问题:
如何仅使用正则表达式交换组 2 和组 3,因此组 2 的值为 11F63B00,组 3 的值为 2018-02-28。此外,我还想删除方括号内的案文(第4组(,包括括号本身。
在线示例。
捕获的字符串按在模式中找到捕获的顺序返回。
可以使用前瞻更改顺序。
/
^ pub s+ (S+) s+
(?= S+ s+ .* s+ .{0,32}(.*) s+ .* < S+ > )
(S+) s+ .* s+ .{0,32} .* s+ (.*) <(S+)>
/x
如果我们用线条来表达,我们会得到以下内容:
/
^ pub h++ (S++) h++ # Line 1 (part 1)
(?= .*+ n # Line 1 (part 2)
h*+ S*(S{8}) # Line 2
)
(S++) .*+ n # Line 1 (part 2)
.*+ n # Line 2
(.*S) s++ <([^<>s]++)> # Line 3
/x
(我也这样做了,出于习惯,匹配失败无法更快地匹配。
(如果可以接受,S{32}
会比S*
快。
(我也这样做了,所以第四次捕获没有尾随空格。
也就是说,更好的解决方案是在事后修复订单。
@captures = @captures[0,2,1,3,4];
或
@captures[1,2] = @captures[2,1];
如果您的数据在d
文件中
perl -ane 'if($F[1]==2) {$n=<>;@k=split /s+/,$n;@j=split /s+/;s/$j[3]/$k[3]/;$n=~s/$k[3]/$j[3]/;print "$_$n" } else {s/[.*].+//;print}' d