解析括号内标签后的值

解析括号内标签后的值

我在循环$p中读取的文件中含有以下数据while。我使用( )grep行来表示、 和。当我发现标签存在时,我想提取标签后面括号中的值。$pPIDAPPLTAGUOWLOGDAUOWLOGTI

AMQ8276: Display Connection details.
   CONN(4C521F5F01501624)
   EXTCONN(414D5143534154322020202020202020)
   TYPE(CONN)
   PID(27948)
   APPLTAG(WebSphere MQ Client for Java)
   UOWLOGDA(2020-07-29)                    UOWLOGTI(11.50.30)
AMQ8276: Display Connection details.
   CONN(4C521F5F9920182E)
   EXTCONN(414D5143534154322020202020202020)
   TYPE(CONN)
   PID(23273)                              APPLTAG(service.core.EnricherMain)
   UOWLOGDA(2020-07-29)                    UOWLOGTI(11.50.46)

答案1

好吧,你可以grep只使用回顾来获得值:

$ grep -Po '(?<=PID\(|APPLTAG\(|UOWLOGDA\(|UOWLOGTI\()[^)]+' file
27948
WebSphere MQ Client for Java
2020-07-29
11.50.30
23273
service.core.EnricherMain
2020-07-29
11.50.46
  • -PPerl 风格的正则表达式
  • -o仅打印匹配的模式
  • (?<=things)stuffthings获取后验断言后的内容
  • \(文字左括号
  • thing1|thing2交替 - 匹配thing1thing2
  • [^)]+一些不是右括号的字符

此表达式适用于您的示例,但将其添加\b到搜索模式的前面可能更可靠,这样只有在它们前面有单词分隔符(行首、空格、制表符等)时才会被捕获,以防同一模式可能是单词的结尾部分。此外,如果有可能匹配的单词后跟一个左括号,而没有右括号,而您不想捕获,您可以通过在(?=\))此处附加来明确地向前查找右括号,以便更可靠地仅获取匹配括号之间的字符:

grep -Po '(?<=\bPID\(|\bAPPLTAG\(|\bUOWLOGDA\(|\bUOWLOGTI\()[^)]+(?=\))'

但我不确定这种方法是否适合您的目的。

非常感谢fra-san提出改进建议这个答案:)

相关内容