在字符串与bash文本实用程序匹配后计算出现次数

aL3*_*3xa 5 regex bash awk grep sed

我正试图用一些很酷的conky配置来重新组织我的桌面.因为我是Emacs中org-mode的忠实粉丝,所以我想从org文件中删除任务,在那里我保存我的日常任务并将其显示为conky.说我有这样的文件:

* first item
** subitem
** subitem
** subitem
* second item
** subitem
** subitem
* third item
** subitem
** subitem
** subitem
** subitem
Run Code Online (Sandbox Code Playgroud)

我想创建一个我的任务摘要,它将检查所有以任何开头的任务*并计算**之前的项目.然后我想以合适的方式提出这个问题:

* first item [3]
* second item [2]
* third item [4]
Run Code Online (Sandbox Code Playgroud)

虽然我能找到字符串的出现只有一个开头*grep:

grep "^\\* " foo.org
Run Code Online (Sandbox Code Playgroud)

我可以计算出的次数**:

grep -c "^\\*\{2\}" foo.org
Run Code Online (Sandbox Code Playgroud)

我怎样才能达到预期的效果?当然,可以使用Python或Ruby,但我只想坚持使用bash实用程序.

rip*_*pat 2

在您提供的示例文件中:

awk '!/^*/{next}$1=="*"{sub("\\*+ ","");p=$0}$1="**"{c[p]+=1}END{for(i in c) printf "* %s [%s]\n", i ,c[i]-1}'
Run Code Online (Sandbox Code Playgroud)

这将返回所需的输出。

* second item [2]
* first item [3]
* third item [4]
Run Code Online (Sandbox Code Playgroud)

如果需要排序,请将结果通过管道输入sort

awk command | sort -k2,2
Run Code Online (Sandbox Code Playgroud)