代码之家  ›  专栏  ›  技术社区  ›  Kelly Beard

如何从一行文本中提取第二个图案?

  •  1
  • Kelly Beard  · 技术社区  · 7 年前

    在我的问题开始之前,我想说的是,我在AS/400上做这件事,而IBM在保持其实用程序的最新方面真的很差劲。我想提取一个像/[a-zA-Z0-9]*这样的模式。LIB/但找到的第二个匹配项。看看下面两条路径的不同之处:

    /QSYS.LIB/KDBDFC1_5.LIB/AUTNOTMAIN.PGM
    /DATADEV/QSYS.LIB/FPSENGDEV.LIB/AUTNOTMAIN.PGM 
    

    在这种情况下,我想要KDBDFC1\u 5。LIB和FPSENGDEV。LIB,而不是QSYS。LIB。

    5 回复  |  直到 7 年前
        1
  •  2
  •   anubhava    7 年前

    您可能需要最后一段。下列的 awk 应该工作:

    awk -F/ '{print $(NF-1)}' file
    
    KDBDFC1_5.LIB
    FPSENGDEV.LIB
    

    或者可能是这个 awk公司 将通过搜索 .LIB 并打印第二个字段:

    awk -F'.LIB' '{print substr($2,2) FS}' file
    
    KDBDFC1_5.LIB
    FPSENGDEV.LIB
    
        2
  •  1
  •   glenn jackman    7 年前

    怎么样

    perl -lne '@matches = /(\w+\.LIB)/g; print $matches[1] if @matches > 1' file
    
        3
  •  1
  •   randomir    7 年前

    match

    $ awk '{p="[a-zA-Z0-9_]*.LIB"; sub(p,""); match($0,p); print substr($0,RSTART,RLENGTH)}' file
    KDBDFC1_5.LIB
    FPSENGDEV.LIB
    
        4
  •  0
  •   Indent    7 年前

    返回 second <word>.LIB :

    perl -pe 's/^(?:.*?\.LIB).*?([\w_.]*.LIB).*$/\1/g'
    

    返回 last 发生 <word>。LIB公司 :

    perl -pe 's/^(?:.*\.LIB).*?([\w_.]*.LIB).*$/\1/g' file
    


    ^ 从开始
    (?:.*\.LIB) 包含的非捕捉群。LIB公司
    .*? 任何不吉利的事情
    ([\w.]*.LIB) 第一捕获组 <word>。LIB公司
    .* 任何贪婪的东西
    $

        5
  •  0
  •   ghoti    7 年前

    sed 's/.*\/\([[:alnum:]_]*\.LIB\).*/\1/' file
    

    当然,你也可以用 grep -o 代替复杂的正则表达式重写:

    grep -o '[[:alnum:]_]*\.LIB' file | awk 'NR%2==0'
    

    awk '{sub(/.*QSYS\.LIB\//,""); sub(/\/.*/,"")}1' file
    

    如果你知道的话 QSYS.LIB 是你试图避免的事情,可能在线路的早期就存在,那么这可能就行了。如果真的是 第二 共两个 .LIB 如果需要文件,可以执行以下操作:

    awk '{match($0,/[[:alnum:]_]+\.LIB/); s=substr($0,RSTART+RLENGTH); match(s,/[[:alnum:]_]+\.LIB/); print substr(s,RSTART,RLENGTH)}' file
    

    或者,为了便于阅读,将其拆分为:

    awk '{
      match($0,/[[:alnum:]_]+\.LIB/);
      s=substr($0,RSTART+RLENGTH);
      match(s,/[[:alnum:]_]+\.LIB/);
      print substr(s,RSTART,RLENGTH)
    }' file
    

    这只使用普通的旧awk函数 match() substr() (1)剥离第一个 .LIB公司 从中,将行的其余部分存储在临时变量中,(2)查找下一个 .LIB公司 在该变量内。

    它的优点是不依赖于事物的任何特定位置,也就是说,它不假设“有趣的”文件紧跟在第一个文件之后,或者是行中最后一个文件的第二个,等等。

    这就是说,这很麻烦,阿努巴瓦的第二个解决方案要优雅得多