我将所有文本注释组织在 AsciiDoc 文件中。 AsciiDoc 是一种类似于 Markdown 的文件格式,但#
我用它=
来表示第一级标题,如下所示:
第一个文件.adoc
= How To Install MySQL 8.0 on Fedora
第二个文件.adoc
= Summaries and Notes From Books I've Read
知道每个文件都包含一个且“仅一个”一级标题= This is a First-Level Heading
,并且它始终位于第 1 行,我的目标是使用grep
并仅查看这些一级标题来搜索所有文件。
此 grep 命令匹配第二个文件:
grep -in '^= .*ooks' *.adoc
这是有道理的,这就是我所需要的。然而,我的终端用红色突出显示“书籍”一词之前的所有内容,并将其余的“我已阅读”保留为白色。这正常吗?
= 书籍的摘要和注释我读了
答案1
grep解决方案
搜索
grep '^=.*rst.*$' *.adoc
在哪里
^
行首=
平等的.*
任何次数的任何事情rst
第一个字符串.*
任何次数的任何事情$
行结束
这将列出文件和找到的行
first.adoc:= The title of the first file
打印结果
grep 将突出显示该行的哪一部分触发了匹配,因此
grep '^=.*rst' *.adoc
将突出显示
首先.adoc:= 第一个标题文件
因为没有请求搜索到行尾。
grep '^=.*rst.*$' *.adoc
将突出显示
首先.adoc:= 第一个文件的标题
因为请求搜索到行尾。
仅文件使用-l
( 或--file-with-matches
)
grep -l '^=.*rst' *.adoc
仅列出行而不列出文件名使用-h
(或--no-filename
)
看man grep
答案2
如果你可以使用awk
支持的GNU版本nextfile
,你所需要做的就是
awk '{ if ( $0 ~ /fifth/ ) print FILENAME ; nextfile }' *.adoc
答案3
如果我正确理解你的问题,你希望突出显示整个标题。
如果是这种情况,您只需将 .* 添加到表达式末尾即可。 grep 以红色显示与匹配表达式匹配的行的过去部分。