【问题标题】:awk regex last occurence of character/patternawk 正则表达式最后一次出现的字符/模式
【发布时间】:2017-08-15 15:41:49
【问题描述】:

我需要获取模式最后一次出现的索引。尝试了来自herehere 的想法。如果我想要最后一个 : 的索引(索引为 6),则以下内容不起作用。尝试使用锚点$,但显然没有抓住它(因为它给了我第一次出现,即 3)。非常感谢您的解释。

echo 12:45:78 | 
awk '
{
print match($1, /:.+$/)
}'

【问题讨论】:

  • 使用/:[^:]*$/[^:]*将匹配除:之外的0+个字符)
  • 实际上,this idea 适合您的场景。你是怎么尝试的?
  • 是的,我现在看到了——已经看过了。变得更聪明...
  • 所以:[^:] 说了:,然后是除: 之外的任何字符多次?
  • 是的。不要忘记 $ 锚。另外,请检查 anubhava 的答案,这可能更适合您(除非您需要更多的东西来检查您的输入,而这确实需要正则表达式)。

标签: regex awk


【解决方案1】:

你需要使用

/:[^:]*$/

这里,[^:]*[^...] 是一个否定括号表达式)将匹配 0+ 个字符除了 :,所以,只有最后一个@ 987654326@ 与第一个 : 匹配。

注意this idea 几乎适合您,唯一的区别是量词:如果您将+[^:] 一起使用,您将无法匹配输入字符串末尾的: .因此,* 是您想要的量词。

模式详情

  • : - : 后跟...
  • [^:]* - 除: 之外的任何 0+ 个字符
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    这里不需要使用任何正则表达式,因为 awk 允许您使用分隔符拆分文件。

    使用:作为输入字段分隔符后,从总行长度中减去最后一个字段的长度,得到正确的索引,如下所示:

    awk -F: '{print length($0) - length($NF)}' <<< '12:45:78'
    
    6
    

    更多示例:

    awk -F: '{print length($0) - length($NF)}' <<< '12:45:78111:123'
    12
    
    awk -F: '{print length($0) - length($NF)}' <<< '12:45:78:123'
    9
    
    awk -F: '{print length($0) - length($NF)}' <<< '12:45'
    3
    
    awk -F: '{print length($0) - length($NF)}' <<< '12:'
    3
    

    【讨论】:

    • 当您使用 awk 时,可以更好地利用所有 awk 的优势 :)
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多