【问题标题】:Using awk to find a line (with regex) then extract word between parantheses使用 awk 查找一行(使用正则表达式)然后在括号之间提取单词
【发布时间】:2015-10-18 08:00:55
【问题描述】:

所以我有一个文本文件,其中包含一行:

#===== In WORD.BLAH.ETC.WORD.STRING(STUFF) =======

我想要STUFF,我想将它存储在一个变量中。

到目前为止,我可以使用awk '/STRING\(/ { print $0 }' $f 正确获取该行,但我不确定如何提取STUFF。它是如何完成的?我没有 GNU AWK。

【问题讨论】:

    标签: regex awk sh


    【解决方案1】:

    求救

    awk '/STRING/{match($0, "\\\((.*)\\\)", a); print a[1];}'
    

    awk '/STRING/{match($0, /\((.*)\)/, a); print a[1];}'
    

    【讨论】:

    • +1。需要 GNU awk。也可以使用匹配函数的结果作为条件:awk 'match($0, /STRING\((.*)\)/, a) {print a[1]}'
    【解决方案2】:

    执行此操作的可靠方法是:

    $ awk 'match($0,/STRING\(([^)]*)\)/,a) { print a[1] }' file
    STUFF
    

    这将始终只打印 STRING 之后的括号之间的内容,即使在输入行之前或之后还有其他括号,例如:

    $ cat file
    abc(def) STRING(STUFF) ghi(klm)
    
    $ awk '/STRING/{match($0, /\((.*)\)/, a); print a[1];}' file
    def) STRING(STUFF) ghi(klm
    
    $ awk 'match($0, /STRING\((.*)\)/, a) {print a[1]}' file
    STUFF) ghi(klm
    
    $ awk -F'[.()]' '$2 == "STRING" {print $3}' file
    $
    
    $ awk 'match($0,/STRING\(([^)]*)\)/,a) { print a[1] }' file
    STUFF
    

    上面使用 GNU awk 作为第三个参数来 match(),其他 awk 使用 match()+substr()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 2013-01-18
      • 2022-01-14
      相关资源
      最近更新 更多