【问题标题】:AWK to print after string match in fileAWK 在文件中的字符串匹配后打印
【发布时间】:2021-12-26 23:44:05
【问题描述】:

我写了一个 awk 命令:

awk -F: '$1=="tag" {print $1;}' setup.py

我想打印引号后的所有内容。

示例输入:

import tools

tools.setup(
    name='test',
    tag="0.0.8",
    packages=tools.ges(),
    line xyz
)

输出: 0.0.8

我试图在标记之后输出所有内容,但我什至无法让它工作。

【问题讨论】:

    标签: macos awk


    【解决方案1】:

    第一种解决方案:使用您展示的示例,请尝试遵循awk 程序。使用awkmatch 函数来匹配正则表达式tag="[^"]*,它将匹配从tag='到下一次出现'之前的所有内容。打印时仅打印匹配部分的子字符串并删除不需要的部分以仅获取版本部分。

    awk 'match($0,/tag="[^"]*/){print substr($0,RSTART+5,RLENGTH-5)}' Input_file
    


    第二个解决方案: 使用 GNU grep 请尝试以下操作。在 GNU grep 中使用 oP 选项,其中 P 选项负责启用 PCRE 正则表达式。在主程序匹配 tag=" 然后使用 \K 选项忘记匹配的值并在下一次出现 " 之前匹配,然后打印匹配的值。

    grep -oP 'tag="\K[^"]*' Input_file
    


    第三种解决方案: 使用 GNU sed 请尝试以下解决方案。使用sed-E 选项将在程序中启用ERE(扩展正则表达式)。使用-n 选项停止打印行,直到我们明确提及打印。在主程序中替换匹配值,这是直到标记的所有内容,并在此处创建第一个也是唯一的反向引用,其中包含两个双引号之间的 "..." 之间的所有内容,并在执行替换时仅用支持的引用值替换它并使用 p 选项打印匹配值。

    sed -E -n 's/.*tag="([^"]*).*/\1/p' Input_file
    

    【讨论】:

    • 第三种解决方案如何打印?
    • @qwerty,首先我用 -n 停止打印,然后当找到匹配项时,仅通过 sed 中的 -p 选项打印该特定匹配项
    • 它没有为我打印任何东西,这就是我问的原因。实际上第一种方法也不打印
    • @qwerty,它需要 GNU sed 可能是问题所在,那么您可以使用其他 2 个解决方案。所有答案都经过测试,对我来说效果很好。所以只有 grep 对你有用?
    • 好的,这行得通,@HatLess 说的也行得通,但最后用 " 和 , 最后一条评论应该有 RSTART + 9, RLENGTH - 9
    【解决方案2】:

    使用gnu awk,您还可以将tag= 与字符串开头的前导可选空格匹配,并在捕获组中捕获标记版本。

    示例代码中的ary[1] 包含组 1 值。

    模式^[[:blank:]]*tag="([0-9]+(\.[0-9]+)*)" 匹配:

    • ^ 字符串开始
    • [[:blank:]]* 匹配可选空格或制表符
    • tag=" 字面匹配
    • ( 捕获第 1 组
      • [0-9]+(\.[0-9]+)* 匹配 1+ 个数字,并可选择重复 . 和 1+ 个数字
    • )关闭第一组
    • "匹配结束"

    gawk 示例:

    awk 'match($0, /^[[:blank:]]*tag="([0-9]+(\.[0-9]+)*)"/, ary) {print ary[1]}' setup.py
    

    输出

    0.0.8
    

    【讨论】:

      【解决方案3】:

      awk 的更简单的解决方案可能是:

      awk -F'"' '/[[:digit:]]/{print $2}' file
      0.0.8
      

      【讨论】:

        猜你喜欢
        • 2019-04-02
        • 1970-01-01
        • 2019-05-04
        • 2015-02-04
        • 2020-06-05
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        相关资源
        最近更新 更多