搜索

搜索

我将所有文本注释组织在 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 以红色显示与匹配表达式匹配的行的过去部分。

相关内容