【问题标题】:Use awk to check for a blank line prior to a bulleted list in markdown使用 awk 在 markdown 中检查项目符号列表之前的空行
【发布时间】:2020-09-25 15:13:22
【问题描述】:

一些 Markdown 处理器在项目符号列表之前需要一个空行。

所以列表

This is a bulleted list: 
- line 1
- line 2
- line 3

会被错误地渲染为

This is a bulleted list: - line 1 - line 2 - line 3

如何使用 awk 来检查以“-”开头的行前面是否有空行或以“-”开头的另一行?

(我使用破折号作为开始标记,以避免与文档前面的内容混淆,它使用三个破折号作为分隔符。)

请注意:与 cmets 中引用的第一个问题不同,这是对反模式的搜索 - 文件中不会发生的事情。

使用pcregrep 这很简单:

pcregrep -Mc '^[A-Z][a-z].*\n- ' $filename 

但我不清楚如何使用awk

我正在做的是:

awkcommand='
/- / {
  if(lastLine != "") {
    print FILENAME
    exit
  }
}

{ lastLine = $0 }
'
awk "$awkcommand" data

在非空行之后捕获单个项目符号。但是当我尝试添加更多条件时(如果前一行不是空白且前一行不是以项目符号开头),它会失败 - 例如,这个:

  if(lastLine != "" && lastline !~/^- /) {

不起作用:它对该文件给出了误报

This is a test

- abc
- def

【问题讨论】:

  • 它可以简化为单行,但这里接受的答案很好地解释了它:stackoverflow.com/questions/14350856/…
  • 这与人们所说的重复它的问题相反。我们正在寻找一种反模式,而不是一种模式。
  • 您可以使用逻辑运算符来获得所需的结果。。我没有投票结束这个问题,但您被否决且未回答的可能原因是因为您没有添加自己的努力对问题
  • 您的 awk 工作正常,刚刚经过测试,包括 if(lastLine != "" && lastline !~/^- /) { 您得到的输出是否与打印的文件名不同?
  • 似乎只是一个错字。将lastline 替换为lastLine

标签: awk


【解决方案1】:
gawk '/^-/{ if (bl==pbl) bl=1; else { pbl=bl; bl=0; }}
    { if (bl==1) print ""; 
      print $0 }'  inputfile

给定输入文件:

This is a bulleted list:
- line 1
- line 2
- line 3

输出将是:

This is a bulleted list:

- line 1
- line 2
- line 3

编辑:

如果您只想打印文件名:

awk '/^-/{ if (bl==pbl) bl=1; else { pbl=bl; bl=0; }}
    { if (bl==1) print FILENAME; }'    inputfiles*

在这种情况下,没有使用需要 gawk 的特殊东西,因此它也应该与 awk 一起使用。

【讨论】:

  • 很好 - 但我希望使用常规 awk,并通过打印文件名来识别条件(而不是修复它)。
【解决方案2】:

您的脚本没问题,您的附加 if 中只有一个错字,它可以工作。

awk '/- / {
  if(lastLine != "" && lastLine !~ /^- /) {
    print FILENAME
    exit
  }
}
{ lastLine = $0 }' file

【讨论】:

  • 对于任何可能想要使用它的人,我的最终检查是:if(lastLine != "" && lastLine !~/^- / && lastLine !~/^[ ]+- / && lastLine !~/^#/ && lastLine != "```") {
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
相关资源
最近更新 更多