AWK 在文件中的字符串匹配后打印

AWK to print after string match in file

我写了一个awk命令:

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

我想在引号中打印标签后的所有内容。

示例输入:

import tools

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

输出: 0.0.8

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

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

awk 'match([=10=],/tag="[^"]*/){print substr([=10=],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 选项停止打印行,直到我们明确提到打印。在主程序中替换匹配值,这是直到标记的所有内容,并在此处创建第一个也是唯一的反向引用,它在 "..." 之间的所有内容在 2 个双引号之间,并且在执行替换时仅用支持的参考值替换它并使用 p 选项打印匹配值。

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

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

示例代码中的

ary[1] 包含第 1 组值。

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

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

gawk 示例:

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

输出

0.0.8

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

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