我的输入文件行格式是:
themostsimpleproject', branch 'debug_randomnness' : AFFECTED. Affected image discovered: [7.19, 8.37]
我想使用 awk 打印 - 项目名称和受影响图像的版本。例子:
themostsimpleproject 7.19, 8.37
我怎样才能在 awk 中做到这一点。我更喜欢可以通过命令行执行的简单代码。前任:awk -F"\," 'print $1 $4'
。但简单的脚本也是受欢迎的。
注意:我不想'
在项目名称末尾打印。
答案1
尝试使用以下方法awk
:
awk -F "[]'[]" '/: AFFECTED/{print $1, $(NF-1)}' input
-F
定义字段分隔符 (FS)。它是一个正则表达式字符串,其中包括一个字符类([..]
),意思是“字符类中包含的任何一个字符”,是字段分隔符。- 这里选择的字符是
'
,[
或]
。 - 必须
]
放在第一位,以避免被视为结束字符。 (你也可以逃脱!)
- 这里选择的字符是
第一个字段
$1
以第一个结尾'
,因此项目名称为$1
受影响的版本是
$(NF-1)
.正如]
最后一个字符一样,$NF
将为空。
输出:
themostsimpleproject 7.19, 8.37
这将搜索带有 String 的行: AFFECTED
,然后输出所有图像版本,即使受影响的版本不止 2 个。
答案2
awk -F "'" '{gsub(/:.*:/,"",$NF);gsub(/[\]\[]/,"",$NF);print $1,$NF}' filename
输出
themostsimpleproject 7.19 8.37
答案3
您还可以使用sed
:
$ sed "s/^\(.*\)',.*\[\(.*\)\]$/\1 \2/" file
themostsimpleproject 7.19, 8.37
或者使用 GNU 版本
$ sed -E "s/^(.*)',.*\[(.*)\]$/\1 \2/" file
themostsimpleproject 7.19, 8.37
答案4
还带有awk
:
awk '{gsub(/[][]/,"");gsub(/[[:punct:]]/,"",$1);print $1, $(NF-1),$NF}' file
themostsimpleproject 7.19, 8.37
- 我们删除了
[
field1中的所有标点符号]
。gsub()
- 然后我们打印第一个字段和最后两个字段。