我有一些文件,其中一些行与这些 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 输出解析为 array。我通常认为当我知道某人想要完成什么时提供帮助会更容易;如果那不是你,请帮我解析这个输出。如果是这样,请继续阅读。
这个链接显示了一个制作自动文档生成文件的单行代码。我讨厌破坏结局,但它看起来 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 的一部分——但是如果你对如何使输出看起来更好有任何想法,那么分享它们并没有太大的麻烦,我真的很想听听他们的声音。