如何将grep输出解析为数组并对其进行迭代

时间:2018-09-29 04:06:21

标签: bash makefile sh

我有一些文件的某些行与这些PCRE匹配:

^([A-Za-z0-9_-]+):.*##(.*)$
^([A-Za-z0-9_-]+)\s*(\?:{1,2})?=(.*)\s*##(.*)$

因此,grep输出当然看起来像这样:

<filename>:$1: ##$2
<filename>:$1 $2 $3 ##$4

我需要使它看起来像这样:

<filename>
$1 $4 ($3) from pattern 2
$1 $2 from pattern 1
...
<filename>
$1 $4 ($3) from pattern 2
$1 $4 ($3 from pattern 2 # all pattern 2 matches first
$1 $2 from pattern 1 # ...followed by all pattern 1 matches
$1 $2 from pattern 1
...

模式1和2分别匹配Makefile中的目标和变量。输出将以打印格式打印-例如,使用?=变量以不同的颜色。如何将grep输出放入一个数组中,然后可以对其进行操作以产生上面的输出?

我不得不删除一个问题,询问如何使其看起来更好,所以我想明确地说,我仅询问如何将grep输出解析为数组。我通常认为,当我知道某人正在努力完成的事情时,提供帮助会更容易。如果不是您,请帮助我解析此输出。如果是这样,请继续阅读。

This link显示了一个单行代码,该文件可以生成自动记录的makefile。我讨厌破坏结局,但是看起来99%都是这样的:

help: ## Display this help message and exit
     @grep -Eh '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort |
     awk 'BEGIN {FS = ":.*?## "};
     {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

它专门针对带有##注释的目标,并使用printf在第30列处对齐注释。我认为将变量以及目标都包括进来将很有帮助。我觉得这是一个相当崇高的原因,可以很容易地做很多事情,以使输出看起来比单线生产的更好(可能是单线!)。我只是在寻求帮助来解析grep输出-这是我非常不擅长的bash的一部分-但如果您有任何想法如何使输出看起来更好,并且共享它们也没有太多麻烦,我真的很想听听他们的声音。

0 个答案:

没有答案