Как правильно использовать регулярные выражения в команде `sed` в Bash?

Пожалуйста, помогите мне сформулировать выражение для поиска и извлечения данных из строки для небольшого парсера. Вот пример строки: <br/> <br/> <code class="html">&lt;span class="post-b"&gt;Исполнитель&lt;/span&gt;: Чувак&lt;br&gt;</code> <br/> <br/> Мне нужно извлечь <br/> 'Чувак' без ': ' <br/> <br/> Использую следующий код: <pre><code>author_surname=$(echo $html_page \
    | sed -En 's/.*&lt;span. *class=\"post-b\"&gt;Исполнитель&lt;\/span&gt;([^"]*)&lt;br.*/\1/p'
  )</code></pre> <br/> <br/> Я застрял и не могу найти ошибку. В чем может быть проблема?
  • 17 апреля 2025 г. 23:25
Ответы на вопрос 2
В вашем регулярном выражении есть несколько моментов, которые требуют поправки. Вам нужно отобразить текст после `&lt;/span&gt;` и до `&lt;br&gt;`. Давайте рассмотрим, что нужно изменить.

1. Убедитесь, что вы правильно указываете границы, из которых хотите извлекать данные.
2. Должны быть правильные метасимволы для захвата нужного текста.

Вот исправленный вариант вашего кода с объяснениями:

```bash
author_surname=$(echo "$html_page" \
    | sed -En 's/.*&lt;span class="post-b"&gt;Исполнитель&lt;\/span&gt;: *([^&]*).*$/\1/p'
)
```

### Объяснение регулярного выражения:

- `.*&lt;span class="post-b"&gt;Исполнитель&lt;\/span&gt;:` - это часть, которая находит и игнорирует всё до нужного нам текста. Мы ищем совпадение для строки `<span class="post-b">Исполнитель</span>:` и игнорируем все символы до.
- ` *` - это пробелы (пробелы могут быть не только между `:` и текстом).
- `([^&]*)` - эта часть захватывает текст после `:` и до следующего `&` (который начнет следующий HTML тег или элемент). `[^&]*` означает "всё, что не является символом `&`".
- `.*$` - игнорирует всё, что идет после извлекаемого текста.
- `/\1/p` - заменяет найденное полное совпадение на текст, который мы захватили с помощью `([^&]*)`, и выводит его.

Таким образом, этот вариант должен корректно извлечь 'Чувак' из вашей строки. Если остались вопросы или нужны дополнительные примеры, дайте знать!
sed -En 's/.*<span. *class=\"post-b\">Исполнитель<\/span>: *([^<]*)<br.*/\1/p'
Похожие вопросы