Как я могу grep для каждого неравного матча? - PullRequest
2 голосов
/ 26 марта 2020

Блокированные кодовые блоки уценки выглядят следующим образом

```
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")
```

1 Ответ

1 голос
/ 26 марта 2020

Я думаю, что было бы проще с .

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

f обозначает, был ли последний матч четным или неравномерным. Он сбрасывается в начале каждого файла и отменяется при каждом совпадении. Когда f равно 1 и условие выхода (т.е. текущая строка состоит из трех обратных кавычек, за которыми следуют ноль + пробелы), программа печатает имя файла и переходит к следующему файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...