首页 > 解决方案 > 我怎样才能为每一个不均匀的比赛进行grep?

问题描述

Markdowns 围栏代码块看起来像这样

```
Here is the code
in many lines
```

或像这样:

```text
Here is the code
in many lines
```

“文本”指定应用于突出显示的语言。

我想在一个平面目录上运行并找到所有包含没有指定语言的围栏代码块的文件。如何在没有指定语言的情况下找到受保护的代码块?

我试过的

以下是我想要的超集:

$ grep -rIE -m1 "\`\`\`[[:space:]]*$" *

问题是结束部分。本质上,这会找到所有具有围栏代码块的文件。但是我如何为每个不均匀的三次反引号grep?

我的猜测是我必须使用 grep 来获取完整的代码块。保证在三重反引号或语言之后有换行符。

所以我尝试了以下两个:

grep -rIzPo -m1 "\`\`\`\\n(.*?)\`\`\`" *
grep -rIzEo -m1 "\`\`\`\\n(.*?)\`\`\`" *

它发现了几个案例,但至少漏掉了一个。我不知道为什么。

问题:两个代码块

我有许多包含多个代码块的文件,例如:

```python
a = "Hello"
b = "Stackoverflow"

print(f"{a} {b}")
```

and

```python
    print("foobar")
```

请注意,我不希望与此内容匹配的文件!到目前为止我尝试的所有正则表达式都匹配

```

and

```python
    print("foobar")
```

标签: regexgrep

解决方案


我认为使用会更容易。

awk 'BEGINFILE{f=0} /^```/{f=!f}
     f&&/^```\s*$/{print FILENAME;nextfile}' *

f表示最后一场比赛是均匀的还是不均匀的。它在每个文件的开头被重置,并被每次匹配取反。当f为 1 并且满足退出条件(即当前行是三个反引号后跟零+空格)时,程序打印文件名并移动到下一个文件。


推荐阅读