我试图找到所有*.md
at ${PWD}
,然后 grep 查找以 开头的行title:
并将其与绝对文件路径-H
和模式匹配的行号一起打印-n
,然后我尝试将结果输出到带有分隔符的表-s
中:
find ${PWD} -type f -name "*.md" -exec bash -c 'i="$1"; grep -HnE "^title:" $1; | column -t -s :;' _ {} \;
这在 grep 之前一直有效,但我无法创建表。
另外,从@steeldriver建议的更正来看,执行似乎是在每个find
结果上一一发生的,因此没有创建表?
样本输出
/Admin/Specification/Specification.md 2 title Specification
/Admin/GraphicCard/index.md 2 title "GraphicCard"
答案1
你可能想太多了。与其尝试将 的结果制成表格grep
,为什么不让awk
一位多产的表格制作者为您制作表格呢?
find . -type f -name \*.md -print0 | xargs -0 awk 'BEGIN { OFS="\t" } /^title:/ { print FILENAME, FNR, $0 }'
find
将找到md
您感兴趣的所有文件,并将它们作为参数awk
通过xargs
.然后,我们awk
在与您的条件匹配的行上吐出文件名(将find
通过完整的相对路径传递)、文件中的记录号(即行号)以及如文件;全部由OFS
输出字段分隔符中定义的制表符分隔。
如果您想更精确地对齐输出,您可以执行以下操作:
/^title:/ { printf( "%35s %4d %s\n", FILENAME, FNR, $0 ) }
另外,如果您不想find | xargs awk
但又愿意find -exec
,这也可以:
find . -name \*.md -type f -exec awk '/expiry/ { printf( "%30s %4d %s\n", FILENAME, FNR, $0 ) }' "{}" +