【问题标题】:Problem in matching string with awk regex使用 awk 正则表达式匹配字符串的问题
【发布时间】:2020-01-17 13:22:12
【问题描述】:

我正在尝试匹配以下句子

ldcValue = 0.00

我尝试创建的正则表达式必须匹配:

  • 关系运算符的左边必须是一个以“ldc”为前缀的变量。
  • 中间必须是关系运算符 "", "=", ">=" , "
  • 右边必须是一个以“ldc”作为前缀或数字如“0.0”或“0.0d”开头的变量

我试过这个正则表达式:

if(match(line, "/(\<(ldc)\w*)(\t| )+(\=|>|<|>=|<=)\(\t| )*(\<(ldc)\w*)|\w*") > 0){ 
        print "match: "substr($0, RSTART, RLENGTH);
    }

但不匹配。

输入示例

ldcValue > 0.00
ldcValue = 0
ldblValue = ad_value / llDias
ldcValue = ad_Value * ldblFator

预期输出匹配:

   ldcValue > 0.00
   ldcValue = 0

什么是正确的正则表达式?

谢谢。

【问题讨论】:

  • edit 您的问题是提供示例输入,其中包含与您的目标字符串匹配和不匹配的几行以及由此产生的预期输出。确保输入涵盖非平凡的情况,例如以fooldcValue 开头的字符串和以ldcValue !- 0.0 开头的字符串等,因此脚本可能很难不正确匹配。还包括在单行上有多个匹配项(如果存在)的情况。
  • 感谢您的建议,但无需添加重要的示例,因为我确信这不会发生在我的情况下。

标签: regex awk


【解决方案1】:

在 Awk 中,在正则表达式周围加上引号或斜线,但不能同时加上。您当前的尝试需要在第一个 ldc 之前添加一个斜杠。

此外,传统的 Awk 通常不支持 \w,这是一个 Perl 扩展。

试试

/\<ldc[A-Za-z0-9_]+[ \t]*([><]=|[<>=])[ \t]*(ldc[A-Za-z0-9_]|[0-9]+(\.[0-9]*)?d?)/

您的问题陈述模糊地听起来您需要一个适当的解析器,而不仅仅是一个正则表达式。

【讨论】:

  • 并且喜欢静态模式而不是动态模式。
  • GNU awk 确实支持 \w,我想知道 \&lt; 是 POSIX 还是仅受特定实现支持
  • 你说得对,我们在整个脚本中都使用了 \w 并且效果很好!
  • @Sundeep \&lt; 是 gawk 特定的。
  • 您也可以将[ \t] 替换为\s。顺便说一句,([&gt;&lt;]=|[&lt;&gt;=]) 将匹配 &lt;&lt; - 不确定这是否可以接受,它应该是 ([&lt;&gt;]=?|=)
猜你喜欢
  • 2020-05-06
  • 2013-04-13
  • 2016-07-31
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2020-05-07
  • 2021-07-10
相关资源
最近更新 更多