【问题标题】:Working with the awk line matching pattern使用 awk 行匹配模式
【发布时间】:2019-01-14 23:30:48
【问题描述】:

工具awk 有类似的线型匹配

/pattern/ { statements; }

有什么方法可以将pattern 的字符串作为变量,用于match 表达式等?

或者更好,直接get:

  • 模式匹配文本
  • 模式匹配长度
  • 如果模式中有(groups),则匹配组

{statements} 块内?

【问题讨论】:

  • 如果你能发布一个例子,我也可以用输出更新我的答案:)
  • edit 您的问题包括minimal reproducible example,其中包含简洁、可测试的样本输入和预期输出,以便我们为您提供最好的帮助。如果不清楚,请参阅How to Ask

标签: awk


【解决方案1】:

如果您使用 GNU awk,而不是在条件部分使用 /pattern/,而是使用 match 及其第三个参数 match(string, regexp [, array]),您可以访问匹配的文本、起始索引、长度和组:

$ echo foobar | 
gawk 'match($0, /(fo*)(b.*)/, a) {
    print a[0],a[0,"start"],a[0,"length"]    # 0 index refers to whole matched text
    print a[2],a[2,"start"],a[2,"length"]    # 1, 2, etc. to matched groups
}'
foobar 1 6
bar 4 3

请参阅GNU awk documentation for match 了解更多信息。

【讨论】:

  • 啊哈,你可以在模式表达式中使用 match,你不必在 if 块里面使用它!这就是我错过的线索。
  • 你认为b.?* 在你的正则表达式中是什么意思?不,这并不意味着:-)。
  • 我对它的工作感到有点困惑,只是把它放在那里,没想到有人会注意到它,所以感谢你的注意。 :D
【解决方案2】:

请你试试下面的。

第一个:获得匹配的文本match 是最好的选择。

awk 'match($0,/regex/){print substr($0,RSTART,RLENGTH)}'  Input_file

第二个:获取匹配字符串的长度:

awk 'match($0,/regex/){print RLENGTH}'  Input_file

3rd:要获取所有匹配的模式,请使用 while 循环匹配,直到在行中找到匹配,我们应该获取所有匹配的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多